查詢轉換

yuanzai32發表於2014-01-17
一個查詢語句在進行完語句和許可權檢查後,會有一步查詢轉換的步驟,再到優化器為了決定最終的執行計劃計算成本評估。
查詢轉換的主要目的是確定如果改變查詢的寫法會不會提供更好的查詢計劃
如:
select *
  from hr.employees
 where department_id in (select department_id from hr.departments);  --1
可能會被轉化為 
select t1.*
  from hr.employees t1, hr.departments t2
 where t1.department_id = t2.department_id;  --2
 
 結果集沒有改變,但是在優化器看來,轉化後的版本執行計劃的選擇將會更好
 
 幾種基本的查詢轉換如下:
 1.檢視合併
 2.子查詢巢狀
 3.謂語前推
 4.使用物化檢視進行查詢重寫

 檢視合併
     檢視合併,顧名思義,就是將原有的內嵌式檢視展開為獨立分析或者與剩餘查詢部分合併成總體執行計劃的獨立查詢塊的轉換。
 這句話有點繞,在我理解來,就是將檢視還原為表查詢,再尋找最合適的執行計劃
 look:
 --語句1
 select *
   from scott.emp e, (select empno from scott.emp) e_view
  where e.empno = e_view.empno;
 
 --我們在檢視加入一個提示(/*+ merge*/強制檢視合併,/*+ no_merge*/強制檢視不合並)來防止語句被重寫
 --語句2
 select *
   from scott.emp e,
        (select /*+ no_merge*/
          empno
           from scott.emp) e_view
  where e.empno = e_view.empno;

檢視執行計劃
-- 語句1檢視被合併
執行計劃
----------------------------------------------------------
Plan hash value: 4089764794
-----------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |    14 |  1400 |     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS           |        |    14 |  1400 |     3   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL  | EMP    |    14 |  1218 |     3   (0)| 00:00:01 |
|*  3 |   INDEX UNIQUE SCAN| PK_EMP |     1 |    13 |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("E"."EMPNO"="EMPNO")

-- 語句2檢視未合併
執行計劃
----------------------------------------------------------
Plan hash value: 1614380175
--------------------------------------------------------------------------------
| Id  | Operation              | Name   | Rows  | Bytes | Cost (%CPU)| Time|
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |        |    14 |  1400 |     6  (17)| 00:00:01|
|*  1 |  HASH JOIN             |        |    14 |  1400 |     6  (17)| 00:00:01|
|   2 |   TABLE ACCESS FUL | EMP    |    14 |  1218 |     3   (0)| 00:00:01|
|   3 |   VIEW                 |        |    14 |   182 |     2   (0)| 00:00:01|
|   4 |    INDEX FAST FULL SCAN| PK_EMP |    14 |   182 |     2   (0)| 00:00:01|
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("E"."EMPNO"="E_VIEW"."EMPNO")

注意:還有一些情況會阻止檢視合併的發生,如果一個查詢塊包含分析函式,或者聚合函式,集合運算(union/intersect/minus..),order by子句或者用了rownum,檢視合併將會被禁止或限制
Oracle Database Performance Tuning Guide>11.1.2.1
The view merging optimization applies to views that contain only selections, projections, and joins. That is, mergeable views do not contain set operators, aggregate functions, DISTINCTGROUP BYCONNECT BY, and so on.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26477854/viewspace-1072251/,如需轉載,請註明出處,否則將追究法律責任。

相關文章