【sql调优之执行计划】获取执行计划(一)

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/7194105/viewspace-674954/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7194105/viewspace-674954/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值