exists、in的運用場景

531968912發表於2016-09-05
exists、in的運用場景
 
            能不寫子查詢,儘量不寫子查詢,而是直接編寫多表連線操作。理由如下:
            ① oracle CBO在parse階段,會盡可能把子查詢轉化為多表連線
            ② 子查詢可讀性較低    
            ③ 複雜的邏輯,子查詢可能導致oracle CBO選擇錯誤的執行路徑
            但如果必須寫子查詢,到底是in還是exists?exists/not exists專門用於關聯子查詢。10g之後,oracle對in的改進,這兩者無甚區別。
 
            in和select的技術原理:
            ㈠ in:先進行子查詢,再進行主查詢
            ㈡ exists:先進行主查詢,再到子查詢中過濾
 
            in和exists的使用建議:
            Ⅰ 如果限制性強的條件在子查詢,則使用in
            Ⅱ 如果限制性強的條件在主查詢,則使用exists
            可用查詢結果集來理解上面這段話,採用最最佳化匹配原則:拿最小記錄匹配大記錄。限制性強,則結果集小;反之,則大。
            註釋:
            ① 使用exists可以將子查詢結果定位常量,不影響查詢結果,而且,效率高。
               比如:
[sql] 
select e.*  
  from emp e  
 where exists   
 (select 1 from dept d  
   where e.deptno=d.deptno and  
         d.dname='SALES')  
   
            ② not in可能會因為null而改變其行為導致和not exists結果集有出入。然而,在相關子查詢下,not in和not exists的結果集是一樣的。

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

相關文章