今天在测试过程中偶然发现在Oracleg Release 中Autotrace的功能已经被极大加强和改变
这是一个很有意思的小的变化关于autotrace的使用请参考:启用AutoTrace
接下来让我们先来看一下什么地方发生了改变: SQL> set linesize
SQL> set autotrace on
SQL> select count(*) from v$session
/
COUNT(*)
Execution Plan
Plan hash value:
| Id| Operation | Name| Rows| Bytes | Cost (%CPU)| Time |
| | SELECT STATEMENT| | | | ()| :: |
| |SORT AGGREGATE | | | |||
| | NESTED LOOPS| | | | ()| :: |
|* |FIXED TABLE FULL | X$KSUSE | | | ()| :: |
|* |FIXED TABLE FIXED INDEX| X$KSLED (ind:) | | | ()| :: |
Predicate Information (identified by operation id):
filter(SINST_ID=USERENV(INSTANCE) AND BITAND(SKSSPAFLG)<> AND
BITAND(SKSUSEFLG)<>)
filter(SKSUSEOPC=EINDX)
Statistics
recursive calls
db block gets
consistent gets
physical reads
redo size
bytes sent via SQL*Net to client
bytes received via SQL*Net from client
SQL*Net roundtrips to/from client
sorts (memory)
sorts (disk)
rows processed
注意此时autotrace的输出被良好格式化并给出关于执行计划部分的简要注释
其实这里并没有带来新的东西从Oraclei开始Oracle提供了一个新的工具dbms_xplan用以格式化和查看SQL的执行计划其原理是通过对plan_table的查询和格式化提供更友好的用户输出
dbms_xplan的调用的语法类似:
select * from table(dbms_xplandisplay(format=>BASIC))
使用 TABLE() 操作符或者 CAST 操作
具体用法可以参考Oracle官方文档
实际上从Oraclei开始我们就经常使用如下方式调用dbms_xplan:
Connected to:
Oraclei Enterprise Edition Release Production
With the Partitioning option
JServer Release Production
SQL> explain plan for
select count(*) from dual;
Explained
SQL> @?/rdbms/admin/utlxplp;
PLAN_TABLE_OUTPUT
| Id| Operation|Name | Rows| Bytes | Cost|
| | SELECT STATEMENT | | | | |
| |SORT AGGREGATE| | | | |
| | TABLE ACCESS FULL| DUAL| | | |
Note: rule based optimization
rows selected
utlxplpsql脚本中正是调用了dbms_xplan:
SQL> get ?/rdbms/admin/utlxplp;
Rem
Rem $Header: utlxplpsql jan:: bdagevil Exp $
Rem
Rem utlxplpsql
Rem
Rem Copyright (c) Oracle CorporationAll rights reserved
Rem
RemNAME
Remutlxplpsql UTiLity eXPLain Parallel plans
Rem
RemDESCRIPTION
Remscript utility to display the explain plan of the last explain plan
Rem command Display also Parallel Query information if the plan happens to
Remrun parallel
Rem
RemNOTES
RemAssume that the table PLAN_TABLE has been created The script
Remutlxplansql should be used to create that table
Rem
RemWith SQL*plus it is recomended to set linesize and pagesize before
Remrunning this script For example:
Remset linesize
Remset pagesize
Rem
RemMODIFIED (MM/DD/YY)
Rembdagevil// rewrite with new dbms_xplan package
Rembdagevil// include CPU cost
Rembdagevil// increase Name column
Remjihuang // change order by to order siblings by
Remjihuang // include plan info for recursive SQL in LE row source
Rembdagevil// make deterministic with orderby
Rembdagevil// Explain plan script for parallel plans
Rembdagevil// Created
Rem
set markup html preformat on
Rem
Rem Use the display table function from the dbms_xplan package to display the last
Rem explain plan Use default mode which will display only relevant information
Rem
* select * from table(dbms_xplandisplay());
SQL>
而在OraclegR中Oracle帮我们简化了这个过程一个autotrace就完成了所有的输出这也是易用性上的一个进步吧在使用Oracle的过程中我们经常能够感受到Oracle针对用户需求或易用性的改进这也许是很多人喜爱Oracle的一个原因吧
如果足够信息我们还会注意到在Oracleg中PLAN_TABLE不再需要创建Oracle缺省增加了一个字典表PLAN_TABLE$然后基于PLAN_TABLE$创建公用同义词供用户使用
关于dbms_xplan工具的使用还可以参考Itpub上的讨论:使用dbms_xplan工具查看执行计划