oracle 用EXISTS替代IN
- 1.用EXISTS替代IN
- 在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率.
- 低效:
- SELECT *
- FROM EMP (基礎表)
- WHERE EMPNO > 0
- AND DEPTNO IN (SELECT DEPTNO
- FROM DEPT
- WHERE LOC = ‘MELB’)
- 高效:
- SELECT *
- FROM EMP (基礎表)
- WHERE EMPNO > 0
- AND EXISTS (SELECT ‘X’
- FROM DEPT
- WHERE DEPT.DEPTNO = EMP.DEPTNO
- AND LOC = ‘MELB’)
- (相對來說,用NOT EXISTS替換NOT IN 將更顯著地提高效率)
- 2. 用NOT EXISTS替代NOT IN
- 在子查詢中,NOT IN子句將執行一個內部的排序和合並. 無論在哪種情況下,NOT IN都是最低效的 (因為它對子查詢中的表執行了一個全表遍歷). 為了避免使用NOT IN ,我們可以把它改寫成外連線(Outer Joins)或NOT EXISTS.
- 例如:
- SELECT …
- FROM EMP
- WHERE DEPT_NO NOT IN (SELECT DEPT_NO
- FROM DEPT
- WHERE DEPT_CAT=’A’);
- 為了提高效率.改寫為:
- (方法一: 高效)
- SELECT ….
- FROM EMP A,DEPT B
- WHERE A.DEPT_NO = B.DEPT(+)
- AND B.DEPT_NO IS NULL
- AND B.DEPT_CAT(+) = ‘A’
- (方法二: 最高效)
- SELECT ….
- FROM EMP E
- WHERE NOT EXISTS (SELECT ‘X’
- FROM DEPT D
- WHERE D.DEPT_NO = E.DEPT_NO
- AND DEPT_CAT = ‘A’);
- 本人在使用中發現左外連線效能比not exist更高效,請大家進一步驗證。
- 3.用表連線替換EXISTS
- 通常來說 , 採用表連線的方式比EXISTS更有效率
- SELECT ENAME
- FROM EMP E
- WHERE EXISTS (SELECT ‘X’
- FROM DEPT
- WHERE DEPT_NO = E.DEPT_NO
- AND DEPT_CAT = ‘A’);
- (更高效)
- SELECT ENAME
- FROM DEPT D,EMP E
- WHERE E.DEPT_NO = D.DEPT_NO
- AND DEPT_CAT = ‘A’ ;
- (在RBO的情況下,前者的執行路徑包括FILTER,後者使用NESTED LOOP)
- 4.用EXISTS替換DISTINCT
- 當提交一個包含一對多表資訊(比如部門表和僱員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換
- 例如:
- 低效:
- SELECT DISTINCT DEPT_NO,DEPT_NAME
- FROM DEPT D,EMP E
- WHERE D.DEPT_NO = E.DEPT_NO
- 高效:
- SELECT DEPT_NO,DEPT_NAME
- FROM DEPT D
- WHERE EXISTS ( SELECT ‘X’
- FROM EMP E
- WHERE E.DEPT_NO = D.DEPT_NO);
- EXISTS 使查詢更為迅速,因為RDBMS核心模組將在子查詢的條件一旦滿足後,立刻返回結果.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11536986/viewspace-622018/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用表連線替代exists
- [Oracle] exists 和 not existsOracle
- oracle exists and not existOracle
- oracle中關於in和exists,not in 和 not existsOracle
- oracle中的exists 和not exists 用法詳解Oracle
- oracle中的exists和not exists和in用法詳解Oracle
- oracle中的exists理解Oracle
- [Oracle] minus 和 not exists比較Oracle
- ORACLE 中IN和EXISTS比較Oracle
- oracle in與exists 的區別Oracle
- Oracle 替代變數Oracle變數
- Oracle優化案例-用left join代替反連線 not in not exists(十)Oracle優化
- oracle之優化一用group by或exists優化distinctOracle優化
- exists、in的運用場景
- oracle中in和exists的區別Oracle
- ORACLE 9I not exists的bugOracle
- (轉)ORACLE 中IN和EXISTS比較Oracle
- AdoptOpenJDK替代Oracle JDKJDKOracle
- (轉)ORACLE 中IN和EXISTS的區別Oracle
- Oracle中exists和in的效能差異Oracle
- EXISTS、IN、NOT EXISTS、NOT IN用法區別
- 用pl/sql替代JavaSQLJava
- 轉--oracle中替代LIKE方法Oracle
- oracle SecureFiles 替代之前的 LOBOracle
- 對IN & EXISTS NOT IN & NOT EXISTS的優化優化
- EXISTS、IN、NOT EXISTS、NOT IN的區別(ZT)
- in/exists和not in/not exists執行效率
- oracle sql_not exists與null的測試OracleSQLNull
- 用 useContext + useReducer 替代 reduxContextuseReducerRedux
- sql:delete if exists還是drop if exists?SQLdelete
- 用Kohana框架來替代Zend框架框架
- 【SQL】existsSQL
- Oracle 中不使用NOT IN 和 NOT EXISTS的另一種方法Oracle
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別SQL
- CSS文字溢位用省略號替代CSS
- Linux 核心將用 Nftables 替代 iptablesLinux
- In和exists使用及效能分析(二):exists的使用
- exists和not exists及in和not in的用法與區別