Oracle in and exist

oracle_ace發表於2007-12-12

複習一下in&exist語法:
一般來講in是對外表和內表作Hash Join,而exist是對外表和內表做了一個nested loop,也就是說,對於exist,針對外表(需要遍歷其所有內容)需要遍歷的每一行,都會對內表進行一次查詢,因此如果外表和內表大小相當,in和exist在效能的差別上就不是很大:)
如果兩個表中一個是較小的表,一個是較大的表,如果內表大則用exists效能會更好(因為外表小了,遍歷的行次數就少了很多),內表表小的用in效能會更好。

舉個例子:
例如:表A(小表),表B(大表),CC列上有索引
在外表小,內表大的情況下用in(Hash Join A和B兩個表).效率就會很低,比如:
select * from A where cc in (select cc from B)
這個時候查詢用到了A表上cc列的索引,但是因為A是小表,而且大表B上的索引也沒有充分利用,因此效率不高

而如果用了exist,我們發現走的是對A,B兩個表的nested Loop,對於遍歷A的每一行,都會對大表B進行一次查詢(可能對B表的查詢結果不是太多.)
select * from A where exists(select cc from B where cc=A.cc)
這樣效率會高些,因為用到了B表(大表)上cc列的索引。
 
 not in 和not exists
如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;
而not extsts 的子查詢依然能用到表上的索引。
所以無論那個表大,用not exists都比not in要快。

 

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

相關文章