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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle優化案例-用left join代替反連線 not in not exists(十)Oracle優化
- oracle之優化一用group by或exists優化distinctOracle優化
- Oracle 替代變數Oracle變數
- AdoptOpenJDK替代Oracle JDKJDKOracle
- Oracle中exists和in的效能差異Oracle
- EXISTS、IN、NOT EXISTS、NOT IN(zt)
- [20180808]exists and not exists.txt
- exists()、not exists() 、in()、not in()用法以及效率差異
- sql:delete if exists還是drop if exists?SQLdelete
- 用 useContext + useReducer 替代 reduxContextuseReducerRedux
- 用eBPF/XDP來替代LVSeBPF
- In和exists使用及效能分析(二):exists的使用
- in、exists與索引索引
- Oralce 使用SQL中的exists 和not exists 用法詳解SQL
- MVP風險太大,用EVA替代MVP
- In和exists使用及效能分析(三):in和exists的效能分析
- elasticsearch之exists查詢Elasticsearch
- [精選] SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析SQL
- CSS文字超出長度用省略號替代CSS
- not in 和 not exists 比較和用法
- mysql 關於exists 和in分析MySql
- [20180928]exists與cardinality.txt
- 為什麼用元空間替代永久代?
- 用Rust替代Java重寫DNS解析器RustJavaDNS
- java----volatile, 用更低的代價替代同步Java
- 谷歌應用商店將用 AAB 格式替代 APK:8 月實施谷歌APK
- 對線面試官:SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析面試SQL
- 【原始碼】Redis exists命令bug分析原始碼Redis
- beego報錯 table name: `xxx` not existsGo
- exists與in子查詢優化優化
- 最新Linux系統將用UEFI替代傳統 BIOSLinuxiOS
- 逐步替代
- YouGov:65%的印度人計劃替代TikTok應用Go
- 用於持續整合的13種Jenkins替代方案 -DEVJenkinsdev
- mybatis exists 中使用代替in關鍵字MyBatis
- Python BUG FileExistsError: [Errno 17] File exists: xxxPythonError
- SQL語句中exists和in的區別SQL
- Elasticsearch Java High Level REST Client(Exists API)ElasticsearchJavaRESTclientAPI
- 關於hibernate的 No row with the given identifier existsIDE