Oracle執行計划詳解


定義

執行計划是一條查詢語句在Oracle中的執行過程或訪問路徑的描述。

示例執行計划

組成

  1. 目標SQL的正文、sql_id和執行計划對應的plan_hash_value
    目標SQL的正文

  2. 執行計划主體,主要有內部執行步驟、執行順序、謂詞信息、列信息、Cardinality、Cost等
    執行計划主體

  3. 執行計划的額外補充信息,是否動態采用(dynamic sampling)、是否Cardinality Feedback、是否SQL Profile
    補充信息

模塊解讀

主體Header

Header

  • ID:序號
  • Operation: 當前操作的內容
  • Rows: 當前操作的Cardinality,Oracle估計當前操作的返回結果集。
  • Cost:SQL執行的代價
  • Time:Oracle 估計當前操作的時間

Query Block Name

Query Block Name

Query Block Name / Object Alias (identified by operation id):           --這部分顯示的為查詢塊名和對象別名
-------------------------------------------------------------
 
   1 - SEL$1                                                            --SEL$為select 的縮寫,位於塊1,相應的還有DEL$,INS$,UPD$等 
   3 - SEL$1 / DEPT@SEL$1                                               --DEPT@SEL$1,對應到執行計划中的操作ID為3上,即在表DEPT上的查詢,DEPT為別名,下面類同
   4 - SEL$1 / DEPT@SEL$1
   6 - SEL$1 / EMP@SEL$1
   7 - SEL$1 / J@SEL$1

Outline Data

Outline Data

Outline Data                                                            --提綱部分,這部分將執行計划中的圖形化方式以文本形式來呈現,即轉換為提示符方式
-------------
 
  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.2')
      DB_VERSION('11.2.0.2')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))                  --指明對於DEPT上的訪問方式為使用索引
      FULL(@"SEL$1" "EMP"@"SEL$1")                                      --指明對於EMP上的訪問方式為全表掃描
      FULL(@"SEL$1" "J"@"SEL$1")
      LEADING(@"SEL$1" "DEPT"@"SEL$1" "EMP"@"SEL$1" "J"@"SEL$1")        --指明前導表
      USE_MERGE(@"SEL$1" "EMP"@"SEL$1")                                 --使用USE_MERGE提示,即MERGE SORT排序合並連接
      USE_HASH(@"SEL$1" "J"@"SEL$1")                                    --使用USE_HASH提示,即HASH連接
      END_OUTLINE_DATA
  */

Predicate Information

Predicate Information

  • Access
  1. 通過某種方式定位了需要的數據,然后讀取出這些結果集,叫做Access。
  2. 表示這個謂詞條件的值將會影響數據的訪問路勁(表還是索引)。
  • Filter
  1. 把所有的數據都訪問了,然后過濾掉不需要的數據,這種方式叫做filter 。
  2. 表示謂詞條件的值不會影響數據的訪問路勁,只起過濾的作用。

Column Projection Information

Column Projection Information

Column Projection Information (identified by operation id):             --執行時每一步驟所返回的列,下面的不同步驟返回了不同的列
-----------------------------------------------------------
 
   1 - (#keys=1) "DEPT"."DNAME"[VARCHAR2,14], "EMP"."EMPNO"[NUMBER,22], 
       "EMP"."ENAME"[VARCHAR2,10], "J"."JOB_DESCRIBE"[VARCHAR2,100]
   2 - "DEPT"."DNAME"[VARCHAR2,14], "EMP"."EMPNO"[NUMBER,22], 
       "EMP"."ENAME"[VARCHAR2,10], "EMP"."JOB"[VARCHAR2,9]
   3 - "DEPT"."DEPTNO"[NUMBER,22], "DEPT"."DNAME"[VARCHAR2,14]
   4 - "DEPT".ROWID[ROWID,10], "DEPT"."DEPTNO"[NUMBER,22]
   5 - (#keys=1) "EMP"."DEPTNO"[NUMBER,22], "EMP"."EMPNO"[NUMBER,22], 
       "EMP"."ENAME"[VARCHAR2,10], "EMP"."JOB"[VARCHAR2,9]
   6 - "EMP"."EMPNO"[NUMBER,22], "EMP"."ENAME"[VARCHAR2,10], 
       "EMP"."JOB"[VARCHAR2,9], "EMP"."DEPTNO"[NUMBER,22]
   7 - "J"."JOB_NAME"[VARCHAR2,50], "J"."JOB_DESCRIBE"[VARCHAR2,100]

Note

Note
  動態采樣(dynamic sampling)是Oracle CBO優化器的一種特性。如果相關數據表沒有收集過統計量,又要使用CBO的機制,就會引起動態采樣。
分享碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM