1. 程式人生 > >sql調優之in和exists

sql調優之in和exists

倆者執行過程:

IN 執行過程: sql示例:select * from tabA where x in (select x from tabB); 其執行計劃: (1)執行tabB表的子查詢,得到結果集B; (2)執行tabA表的查詢,查詢條件是x在結果集B裡面,可以使用到tabA表的索引x。

Exists執行過程 sql示例:select * from tabA where exists (select x from tabB where tabA.x = x); 其執行計劃: (1)先將tabA表所有記錄取到。 (2)逐行鍼對tabA表的記錄,去關聯tabB表,判斷tabB表的子查詢是否有返回資料,5.5之後的版本使用Block Nested Loop(Block 巢狀迴圈)。 (3)如果子查詢有返回資料,則將tabA當前記錄返回到結果集。 tabA相當於取全表資料遍歷,tabB可以使用到索引。

個人總結:

當子查詢結果集很大,而外部表較小的時候,Exists的Block Nested Loop(Block巢狀迴圈)的作用開始顯現,並彌補外部表無法用到索引的缺陷,查詢效率會優於IN。in 相當於把子查詢查到的結果放到記憶體裡和外查詢比較,當子查詢查到的資料過大時效率就低了,而exists相當於子查詢是一次又一次的查詢資料庫。

當子查詢結果集較小,而外部表很大的時候,Exists的Block巢狀迴圈優化效果不明顯,IN 的外表索引優勢佔主要作用,此時IN的查詢效率會優於Exists。