原文: http://www.cnblogs.com/AdamLee/p/5054674.html
在網上看到很多關於sql中使用in效率低的問題,於是自己做了測試來驗證是否是眾人說的那樣。
群眾:
對於in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是性能變化的關鍵),如果是exists,那么以外層表為驅動表,先被訪問,如果是IN,那么先執行子查詢,所以我們會以驅動表的快速返回為目標,那么就會考慮到索引及結果集的關系了 ,另外IN時不對NULL進行處理。
這里我找到兩張表,一個是用戶信息表[INDIVIDUAL] 47萬條數據,一個狀態類型表[STATUS] 88條數據,對應上面所述的一多一少

然后進行兩種查詢 (not exists 和 not in一組)(exists 和 in一組)
select * from STATUS s where not exists(select 1 from INDIVIDUAL i where i.STATUS_ID=s.STATUS_ID) select * from STATUS s where s.STATUS_ID not in(select i.STATUS_ID from INDIVIDUAL i )
select * from STATUS s where exists(select 1 from INDIVIDUAL i where i.STATUS_ID=s.STATUS_ID) select * from STATUS s where s.STATUS_ID in(select i.STATUS_ID from INDIVIDUAL i )
查看執行計划后發現,結果貌似是一樣的,令人意外,可能大家認為in 比較慢的原因就是 IN先執行子查詢 ,但是事實並不是這樣的。


但是如果你使用join,就會發現真的對用戶表全盤掃描了.....
