数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

在Oracle10g Release 2中的Autotrace


发布日期:2023年07月21日
 
在Oracle10g Release 2中的Autotrace

今天在测试过程中偶然发现在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>

而在OraclegROracle帮我们简化了这个过程一个autotrace就完成了所有的输出这也是易用性上的一个进步吧在使用Oracle的过程中我们经常能够感受到Oracle针对用户需求或易用性的改进这也许是很多人喜爱Oracle的一个原因吧

如果足够信息我们还会注意到在Oracleg中PLAN_TABLE不再需要创建Oracle缺省增加了一个字典表PLAN_TABLE$然后基于PLAN_TABLE$创建公用同义词供用户使用

关于dbms_xplan工具的使用还可以参考Itpub上的讨论:使用dbms_xplan工具查看执行计划

上一篇:Oracle 数据对象分析

下一篇:常用数据库 JDBC 连接写法全攻略