ORACLE中EXISTS和IN進行子查詢的區別(工作原理分析)

今天和大家分享一下SQL中2個常見的關鍵字:EXISTS和IN。這2個關鍵字很常見,但是區別是什麼
呢?EXISTS和IN的共同點是都是用來做子查詢的。區別如下:

1,EXISTS一般用於相關子查詢,IN一般是用於非相關子查詢。什麼是相關子查詢,什麼是非相關
子查詢,大家可以自行百度,這裏不再贅述。
2,EXISTS適合於外表小而內表大的情況,IN適合於外表大而內表小的情況。這一點對於我們進行
SQL優化就很有幫助了。如果外表的數據量非常大,而內表的數據量非常小,使用IN會提高查詢
效率;如果外表的數據量非常小,而內表的數據量非常大,使用EXISTS會提高查詢效率。

EXISTS和IN是如何工作的呢?我們以ORACLE數據庫爲例。EXISTS是對外表做LOOP循環,在循環體
中執行內表查詢。IN是把外表和內表做hash連接。有了這個概念,我們再來分析一下爲什麼
“EXISTS適合於外表小而內表大的情況,IN適合於外表大而內表小的情況”。EXISTS是對外表做
LOOP循環,在循環體中執行內表查詢,所以循環的次數越少,速度就越快。IN是把外表和內表做
hash連接,所以內表越小,整個查詢的範圍就小,效率就高。

總結:EXISTS的效率並不是都高於IN。但是這裏補充一點,NOT EXISTS 的效率始終是高於NOT IN
的。因爲使用了NOT IN,那麼內外表的查詢都會進行全表掃描,而不走索引,但是使用了NOT EXISTS
,子查詢還是能夠走索引的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章