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查詢轉換(四)連線謂詞推入Oracle
- Oracle 查詢轉換-04 Subquery UnnestingOracle
- Oracle查詢轉換(五)子查詢展開Oracle
- GORM subquery 子查詢GoORM
- 【SQL】Oracle查詢轉換之謂詞推送SQLOracle
- 優化擁有謂詞or的子查詢優化
- Select from subquery 子查詢
- Oracle 12CR2查詢轉換之謂詞推送Oracle
- 執行計劃-6:推入子查詢
- 子查詢-表子查詢
- 查詢轉換
- SQL查詢的:子查詢和多表查詢SQL
- 複雜查詢—子查詢
- Oracle 查詢轉換Oracle
- 使用謂詞(NSPredicate)來提高集合遍歷與過濾查詢的效率
- sql語法相關子查詢與非相關子查詢SQL
- 子查詢包含where ..or在Corelated Subquery 中語句中問題
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- 子查詢中的IN與EXISTS的區別(轉)
- Oracle 查詢轉換初探Oracle
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- MySQL聯結查詢和子查詢MySql
- select查詢之三:子查詢
- [not] in/exists 與 帶TOP的子查詢
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- mysql的子查詢MySql
- 相關子查詢&非相關子查詢概念
- exists與in子查詢優化優化
- Transformation之Subquery Un-nesting(子查詢的非巢狀)SU【六】ORM巢狀
- GP詭異的查詢轉換
- D4.玩轉查詢與替換
- MySQL子查詢MySql
- 子串查詢
- 使用子查詢
- MYsql 子查詢MySql
- oracle子查詢Oracle
- 查詢子串
- 子查詢分解