Oracle學習系列—資料庫優化—In和Exists的使用
關於In和Exists的使用優劣,在官方文件
實際上並不存在優劣之分,Oracle會跟據實際情況進行In和Exists的相互轉換,因此可以說大多數情況下是等效的.
In certain circumstances, it is better to use IN rather than EXISTS. In general, if the selective predicate is in the subquery, then use IN. If the selective predicate is in the parent query, then use EXISTS.
在某種情況,使用In要比Exists更好一些.通常情況下,如果選擇斷言使用在子查詢語句中,最好使用In;如果選擇斷言在父查詢語句中,則最好使用Exists
Note: This discussion is most applicable in an OLTP environment,where the access paths either to the parent SQL or subquery are through indexed columns with high selectivity. In a DSS environment, there can be low selectivity in the parent SQL or subquery, and there might not be any indexes on the join columns. In a DSS environment, consider using semi-joins for the EXISTS case.
備註:這樣的討論在OLTP環境中更適用一些,通常情況下對父或子查詢語句的訪問通過具有良好選擇性的索引列來進行的.而在DSS環境中,訪問子或父查詢語句都是比較的選擇性的或者沒有任何索引列.在DSS環境中可以考慮使用Exists語句.
例如
SELECT /* EXISTS example */ e.employee_id , e.first_name , e.last_name , e.salary FROM employees e WHERE EXISTS (SELECT 1 FROM orders o /* Note 1 */ WHERE e.employee_id = o.sales_rep_id /* Note 2 */ AND o.customer_id = 144); /* Note 3 */ |
將會被解析成
SELECT /* IN example */ e.employee_id , e.first_name , e.last_name , e.salary FROM employees e WHERE e.employee_id IN (SELECT o.sales_rep_id /* Note 4 */ FROM orders o WHERE o.customer_id = 144); /* Note 3 */ |
例如
SELECT /* IN example */ e.employee_id , e.first_name , e.last_name , e.department_id , e.salary FROM employees e WHERE e.department_id = 80 /* Note 5 */ AND e.job_id = 'SA_REP' /* Note 6 */ AND e.employee_id IN (SELECT o.sales_rep_id FROM orders o); /* Note 4 */ |
將會被解析成
SELECT /* EXISTS example */ e.employee_id , e.first_name , e.last_name , e.salary FROM employees e WHERE e.department_id = 80 /* Note 5 */ AND e.job_id = 'SA_REP' /* Note 6 */ AND EXISTS (SELECT 1 /* Note 1 */ FROM orders o WHERE e.employee_id = o.sales_rep_id); /* Note 2 */ |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-145532/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle學習系列—資料庫優化—Access Path和join學習Oracle資料庫優化
- Oracle學習系列—資料庫優化—Sort OperationOracle資料庫優化
- Oracle學習系列—資料庫優化—Statistics SummaryOracle資料庫優化
- Oracle學習系列—資料庫優化—Collect StatisticsOracle資料庫優化
- Oracle學習系列—資料庫優化—Analyze語句和資料字典Oracle資料庫優化
- Oracle學習系列—資料庫優化—效能優化工具Oracle資料庫優化
- Oracle學習系列—資料庫優化—RBO訪問路徑Oracle資料庫優化
- 【原】學習系列—資料庫優化—建立效能良好的資料庫資料庫優化
- Oracle學習系列—資料庫最佳化—Full Scans和Fast Full Index ScansOracle資料庫ASTIndex
- Oracle資料庫優化Oracle資料庫優化
- 對IN & EXISTS NOT IN & NOT EXISTS的優化優化
- Oracle學習系列—Windows下資料庫程式的啟動和關閉OracleWindows資料庫
- Oracle效能優化視訊學習筆記-資料庫配置和I/O問題Oracle優化筆記資料庫
- Oracle資料庫效能優化Oracle資料庫優化
- 資料庫的優化和效率資料庫優化
- Oracle學習系列—資料庫備份—熱備份Oracle資料庫
- 【效能優化】ORACLE資料庫效能優化概述優化Oracle資料庫
- oracle performance tuning效能優化學習系列(三)OracleORM優化
- oracle performance tuning效能優化學習系列(五)OracleORM優化
- oracle performance tuning效能優化學習系列(四)OracleORM優化
- oracle performance tuning效能優化學習系列(二)OracleORM優化
- oracle performance tuning效能優化學習系列(一)OracleORM優化
- ORACLE資料庫效能優化概述Oracle資料庫優化
- [Oracle] exists 和 not existsOracle
- 【原】Oracle學習系列—資料庫備份—RMAN備份Oracle資料庫
- Oracle學習系列—Window作業系統下Oracle資料庫的手工建立Oracle作業系統資料庫
- oracle performance tuning效能優化學習系列(四)_補OracleORM優化
- Oracle 'or exists/in'結合使用引起的filter執行計劃 的優化OracleFilter優化
- Oracle效能優化-資料庫CPU使用率100%Oracle優化資料庫
- Oracle資料庫訪問效能優化Oracle資料庫優化
- Oracle資料庫效能優化總結Oracle資料庫優化
- 【原】Oracle學習系列—資料庫備份—離線備份Oracle資料庫
- Oracle學習系列—Window作業系統下Oracle資料庫的手工建立(zt)Oracle作業系統資料庫
- oracle之優化一用group by或exists優化distinctOracle優化
- Mysql資料庫優化系列(一)------Mysql伺服器優化思路MySql資料庫優化伺服器
- 【轉】Oracle資料庫優化之資料庫磁碟I/OOracle資料庫優化
- Oracle資料庫資料恢復、效能優化 ASKMACLEANOracle資料庫資料恢復優化Mac
- 資料庫學習優質站點資料庫