初入Oracle殿堂的人,在學寫SQL語句時一般會得到一個教誨,那就是exists比in更要高效,但仔細想象要是真的這么簡單那干脆去掉in,豈不是省去很多麻煩? 自己對這兩種查詢語句寫法的熟悉也比較淺顯,但是覺得還是比較有效,所以有愛好的可以瞄一眼哦......先說IN他相當對inner table執行一個個帶有distinct的子查詢語句,然后得到的查詢結果集再與outer table進行連接,當然連接的方式和索引的使用仍然同于普通的兩表連接。select * from T1 where x in (select y from T2);可以轉換成如下select * from T1,(select distinct y from T2) T2where T1.x=T2.y;再說exists實際上exists相當于對outer table進行全表掃描,用從中檢索到的每一行與inner table做循環匹配輸出相應的符合條件的結果,其主要開銷是對outer table的全表掃描(full scan),而連接方式是nested loop方式??梢詫懗蓅elect * from T1 where exists (select NULL from T2 where T2.y=T1.x);轉換成for cursor1 in (select * from T1)loopif (exists (select NULL from T2 where T2.y=cursor1.x))then 返回匹配的記錄;end if;end loop;通過上面的解釋,現在很輕易明白當T2數據量巨大且索引情況不好(大量重復值等),則不宜使用產生對T2的distinct檢索而導致系統開支巨大的IN操作,反之當T1表數據量巨大(不受索引影響)而T2表數據較少且索引良好則不宜使用引起T1全表掃描的EXISTS操作,