【sql調優之執行計劃】獲取執行計劃

yellowlee發表於2010-08-16

sql開發進階到開發高效的sql需要對oraclesql的解析執行有一些瞭解。先看看如何獲得執行計劃。

 

要使用執行計劃需要先執行指令碼:$ORACLE_HOME/rdbms/admin/utlxplan.sql

這個指令碼會建立一個plan_table表,簡單看看這個表的結構:

SQL> desc plan_table

Name            Type          Nullable Default Comments

--------------- ------------- -------- ------- --------

STATEMENT_ID    VARCHAR2(30)  Y               --語句id

TIMESTAMP       DATE          Y                 --時間戳

REMARKS         VARCHAR2(80)  Y                  

OPERATION       VARCHAR2(30)  Y               --操作名稱         

OPTIONS         VARCHAR2(30)  Y                --選項

OBJECT_NODE     VARCHAR2(128) Y               --物件節點   

OBJECT_OWNER    VARCHAR2(30)  Y               --物件所有者

OBJECT_NAME     VARCHAR2(30)  Y               --物件名稱

OBJECT_INSTANCE INTEGER       Y               --物件例項

OBJECT_TYPE     VARCHAR2(30)  Y               --物件型別

OPTIMIZER       VARCHAR2(255) Y               --優化器模式

SEARCH_COLUMNS  NUMBER        Y                --查詢列

ID              INTEGER       Y                  --當前id

PARENT_ID       INTEGER       Y                 --id

POSITION        INTEGER       Y                  --位置id

COST            INTEGER       Y                   --開銷

CARDINALITY     INTEGER       Y                 -- 基數

BYTES           INTEGER       Y                  --位元組數

OTHER_TAG       VARCHAR2(255) Y                 

PARTITION_START VARCHAR2(255) Y               --分割槽開始          

PARTITION_STOP  VARCHAR2(255) Y               --分割槽結束

PARTITION_ID    INTEGER       Y                 --分割槽id

OTHER           LONG          Y                        

DISTRIBUTION    VARCHAR2(30)  Y                -- 分發       

CPU_COST        INTEGER       Y                  --cpu開銷

IO_COST         INTEGER       Y                  --io開銷

TEMP_SPACE      INTEGER       Y

 

看看幾個重要欄位的具體值:

 

SQL> select a.operation,

  2         a.object_name,

  3         a.cost,

  4         a.cardinality cd,

  5         a.bytes bt,

  6         a.io_cost io,

  7         a.cpu_cost cpu

  8    from plan_table a

  9   where a.statement_id is null;

 

OPERATION                      OBJECT_NAME                          COST

------------------------------ ------------------------------ ----------

        CD         BT         IO        CPU

---------- ---------- ---------- ----------

SELECT STATEMENT                                                       3

         1         20          3

 

NESTED LOOPS                                                           3

         1         20          3

 

MERGE JOIN                                                             2

         3         42          2

 

 

OPERATION                      OBJECT_NAME                          COST

------------------------------ ------------------------------ ----------

        CD         BT         IO        CPU

---------- ---------- ---------- ----------

TABLE ACCESS                   T_GROUP_POLICY_PRODUCT                  1

         2         24          1

 

INDEX                          UNI_GROUP_POLICY_PRODUCT                3

         3                     3

 

BUFFER                                                                 1

         2          4          1

 

 

OPERATION                      OBJECT_NAME                          COST

------------------------------ ------------------------------ ----------

        CD         BT         IO        CPU

---------- ---------- ---------- ----------

INDEX                          PK_T_PERIOD_TYPE                        1

         2          4          1

 

TABLE ACCESS                   T_PRODUCT_LIFE                          1

         1          6          1

 

INDEX                          PK_T_PRODUCT_LIFE

         1

 

 

9 rows selected.

 

 

執行指令碼$ORACLE_HOME/sqlplus/admin/plustrce.sql 可以建立plustrace角色便於管理使用執行計劃的使用者的許可權,可以使用grant plustrace role to xxx來賦予使用者相關的使用許可權。

 

 

可以使用explain plan for 來獲得執行計劃,然後查詢plan_table(如前面的查詢語句)來檢視執行計劃,或者使用dbms_xplan包的display方法,例如:

Select * from table(dbms_xplan.display);

 

也可以在sqlplus下使用set autotrace on/traceonly等語句,除了或者執行計劃以外,還可以檢視到執行統計資訊,同時也可以在trace檔案中查詢相關的執行計劃(結合使用tkprof,後續詳述)。

 

可以通過查詢系統檢視來獲得執行計劃,例如:

SQL> select a.ADDRESS,a.HASH_VALUE,a.OPERATION,a.COST from v$sql_plan a where rownum = 1;

 

ADDRESS          HASH_VALUE OPERATION              COST

---------------- ---------- -----------------------------

07000004BFF2D0D0 3606577152 UPDATE STATEMENT       1

 

可以使用alter session/system set sql_trace=true/false;來開啟關閉sql追蹤,而在trace檔案中獲得執行計劃。例如:

 

SQL> alter session set sql_trace=true;

 

Session altered.

 

SQL> alter session set sql_trace=false;

 

Session altered.

 

SQL>

 

也可以從statspack等工具的使用來獲得。(後續詳述)

 

或者使用一些工具,例如toadplsql dev來獲得,其原理還是查詢相關的表或者系統檢視。

 

 

 

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

相關文章