CBO的查詢轉換(謂詞推入與子查詢展開(Subquery Unnesting))
1. 謂詞推入
謂詞推入是將外層的相關謂詞,推入至內層查詢檢視當中(View Query Block),使得內層檢視可以利用謂詞進行索引掃描或者過濾
如:
SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a union all
select col1, col2, col3 from table_b b )
WHERE col1 = 'SAMPLE'
=>
SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a where col1 = 'SAMPLE' union all
select col1, col2, col3 from table_b b WHERE col1 = 'SAMPLE')
如果沒有謂詞推入, table_a, table_b肯定都是進行全表掃描,有了謂詞推入, table_a.col1, table_b.col1, 有了建立索引進行索引掃描的可能。
2. 子查詢展開(Subquery Unnesting):
子查詢展開的意思是, 優化器將一個巢狀查詢展開為等價的表連線, 進而優化表連線。
子查詢展開使得優化器可以考慮子查詢相關表的訪問路徑,關聯順序,關聯方式的選擇。只有當轉換之後的語句與轉換之前的語句返回相同的行數,並且子查詢不包含AVG這樣的聚合函式的時候,才會進行這樣的轉換。
例:
SELECT *
FROM sales
WHERE cust_id IN ( SELECT cust_id
FROM customers );
=>
SELECT sales.*
FROM sales, customers
WHERE sales.cust_id = customers.cust_id;
謂詞推入是將外層的相關謂詞,推入至內層查詢檢視當中(View Query Block),使得內層檢視可以利用謂詞進行索引掃描或者過濾
如:
SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a union all
select col1, col2, col3 from table_b b )
WHERE col1 = 'SAMPLE'
=>
SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a where col1 = 'SAMPLE' union all
select col1, col2, col3 from table_b b WHERE col1 = 'SAMPLE')
如果沒有謂詞推入, table_a, table_b肯定都是進行全表掃描,有了謂詞推入, table_a.col1, table_b.col1, 有了建立索引進行索引掃描的可能。
2. 子查詢展開(Subquery Unnesting):
子查詢展開的意思是, 優化器將一個巢狀查詢展開為等價的表連線, 進而優化表連線。
子查詢展開使得優化器可以考慮子查詢相關表的訪問路徑,關聯順序,關聯方式的選擇。只有當轉換之後的語句與轉換之前的語句返回相同的行數,並且子查詢不包含AVG這樣的聚合函式的時候,才會進行這樣的轉換。
例:
SELECT *
FROM sales
WHERE cust_id IN ( SELECT cust_id
FROM customers );
=>
SELECT sales.*
FROM sales, customers
WHERE sales.cust_id = customers.cust_id;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8520577/viewspace-2080434/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 查詢轉換-04 Subquery UnnestingOracle
- 【SQL】Oracle查詢轉換之謂詞推送SQLOracle
- GORM subquery 子查詢GoORM
- Oracle 12CR2查詢轉換之謂詞推送Oracle
- 執行計劃-6:推入子查詢
- SQL查詢的:子查詢和多表查詢SQL
- Oracle 查詢轉換Oracle
- 複雜查詢—子查詢
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- D4.玩轉查詢與替換
- Oracle 查詢轉換-01 or expansionOracle
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- exists與in子查詢優化優化
- MySQL之連線查詢和子查詢MySql
- MYsql 子查詢MySql
- MySQL子查詢MySql
- 子串查詢
- Oracle 查詢轉換-02 View MergingOracleView
- Oracle 查詢轉換-03 Predicate PushingOracle
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- 【大資料】SparkSql連線查詢中的謂詞下推處理(一)大資料SparkSQL
- 【大資料】SparkSql 連線查詢中的謂詞下推處理 (二)大資料SparkSQL
- 如何在word中進行查詢與替換 word文件中的替換與查詢功能
- 什麼是SQL 語句中相關子查詢與非相關子查詢SQL
- 從Oracle 11.2.0.4 BUG到Oracle子查詢展開分析Oracle
- 區分關聯子查詢和非關聯子查詢
- 離線查詢與線上查詢
- Javaweb-子查詢JavaWeb
- 巢狀子查詢巢狀
- Laravel Query Builder 複雜查詢案例:子查詢實現分割槽查詢 partition byLaravelUI
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- MySQL資料庫基礎——多表查詢:子查詢MySql資料庫
- MySQL全面瓦解11:子查詢和組合查詢MySql
- 34. 過濾條件、多表查詢、子查詢
- vim查詢替換
- Oracle 12CR2查詢轉換之星型轉換Oracle
- mysql求交集:UNION ALL合併查詢,inner join內連線查詢,IN/EXISTS子查詢MySql