ORACLE 中IN和EXISTS比較

tthero00boo發表於2013-07-07
ORACLE 中IN和EXISTS比較

--先記下來,回頭驗證下

EXISTS的執行流程      
select * from t1 where exists ( select null from t2 where y = x ) 
可以理解為: 
  for x in ( select * from t1 ) 
  loop 
      if ( exists ( select null from t2 where y = x.x ) 
      then 
        OUTPUT THE RECORD 
      end if 
  end loop 
對於in 和 exists的效能區別: 
  如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in,反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。 
  其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 
                          
另外IN時不對NULL進行處理 
如: 
select 1 from dual where null  in (0,1,2,null) 
為空

從效能上來看
exists是用loop的方式,迴圈的次數影響大,外表要記錄數少,內表就無所謂了
in用的是hash join,所以內表如果小,整個查詢的範圍都會很小,如果內表很大,外表如果也很大就很慢了,這時候exists才真正的會快過in的方式。 
not in和not exists的區別 
not in內外表都進行全表掃描,沒有用到索引; 
not extsts 的子查詢能用到表上的索引。 
所以推薦用not exists代替not in 
不過如果是exists和in就要具體看情況了 
create table build_tab
initrans 3
nologging
as
with generator as (
select --+ materialize
rownum id
from all_objects 
where rownum <= 3000
)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28859270/viewspace-765695/,如需轉載,請註明出處,否則將追究法律責任。

相關文章