Oracle查詢轉換(二)複雜檢視合併
檢視的定義及分類參考:http://blog.itpub.net/28536251/viewspace-1871039/
如果目標SQL中包含了檢視,且該檢視為一個複雜檢視,則最佳化器會評估檢視合併的成本,如果成本低於原SQL的成本,才會做檢視合併。
建立一個複雜檢視:
SQL> create view employees_vw as select department_id,sum(salary) sal_sum from employees group by department_id;
View created.
SQL> select d.department_name,e.sal_sum from employees_vw e,departments d where e.department_id=d.department_id and department_name='IT';
Execution Plan
----------------------------------------------------------
Plan hash value: 3808327043
---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 224 | 5 (20)| 00:00:01 |
| 1 | HASH GROUP BY | | 8 | 224 | 5 (20)| 00:00:01 |
| 2 | NESTED LOOPS | | 10 | 280 | 4 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 10 | 280 | 4 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | DEPARTMENTS | 1 | 21 | 3 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 10 | | 0 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 10 | 70 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------
可以看到執行計劃中沒有檢視employees_vw的名字,且將檢視中的group by放到了兩個表連線之後執行,表示最佳化器已經做了檢視合併。可以使用NO_MERGE Hint來禁止最佳化器進行檢視合併:
SQL> select /*+ no_merge(e) */d.department_name,e.sal_sum from employees_vw e,departments d where e.department_id=d.department_id and department_name='IT';
Execution Plan
----------------------------------------------------------
Plan hash value: 1313696113
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 29 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 29 | 5 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | DEPARTMENTS | 1 | 16 | 3 (0)| 00:00:01 |
| 3 | VIEW PUSHED PREDICATE | EMPLOYEES_VW | 1 | 13 | 2 (0)| 00:00:01 |
|* 4 | FILTER | | | | | |
| 5 | SORT AGGREGATE | | 1 | 7 | | |
| 6 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 10 | 70 | 2 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 10 | | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------
可以看到執行計劃中出現了檢視EMPLOYEES_VW的名字,則表示最佳化器沒有對檢視進行檢視合併。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28536251/viewspace-2140720/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL】Oracle查詢轉換之檢視合併SQLOracle
- Oracle查詢轉換(一)簡單檢視合併Oracle
- Oracle查詢轉換(三)外連線檢視合併Oracle
- Oracle 12CR2查詢轉換之檢視合併Oracle
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- oracle表複雜查詢Oracle
- Oracle複雜查詢(三)Oracle
- 【SQL優化器查詢變換器】檢視合併(View Merging)SQL優化View
- 包含複雜查詢的快速重新整理的物化檢視
- 複雜查詢—子查詢
- Oracle 查詢轉換Oracle
- oracle 常用查詢檢視Oracle
- 水煮oracle31----連線查詢&合併查詢Oracle
- SQL 複雜查詢SQL
- SQL複雜查詢SQL
- 合併查詢
- Oracle 查詢轉換初探Oracle
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- 隱式轉換影響物化檢視查詢重寫
- Oracle Database 12c查詢最佳化器的缺陷-檢視合併會造成查詢結果不準確OracleDatabase
- Solr複雜查詢一:函式查詢Solr函式
- Oracle 查詢轉換-01 or expansionOracle
- Oracle查詢轉換(五)子查詢展開Oracle
- 【PDB】Oracle跨PDB檢視查詢Oracle
- Elasticsearch複合查詢——boosting查詢Elasticsearch
- JPA的多表複雜查詢
- 複雜的行列轉換
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- 複雜SQL查詢和視覺化報表構建SQL視覺化
- 【Oracle】如何查詢檢視時使用索引Oracle索引
- SQL學習(三) 複雜查詢SQL
- Laravel使用MongoDB複雜的查詢LaravelMongoDB
- SQL複雜查詢多表連線SQL
- 複雜查詢語句的使用
- MySQL 合併查詢union 查詢出的行合併到一個表中MySql
- 查詢轉換
- Oracle 12CR2查詢轉換之星型轉換Oracle
- Oracle 查詢轉換-04 Subquery UnnestingOracle