set autotrace on

在SQL*Plus中,你可以通过设置autotrace选项来在执行SQL命令的同时,自动的获得语句的执行计划和附加的统计信息。AUTOTRACE是一个很出色的Oracle SQL语句的诊断工具,与Explain plan不同的是这条SQL是实际执行了的,同时AUTOTRACE使用起来也极为方便。


一、启用Autotrace功能。
任何以SQL*PLUS连接的session都可以用Autotrace,不过还是要做一些设置的,否则可能报错。

1、报错示例:
SQL :> set autotrace on;
SP2-0613: Unable to verify PLAN_TABLE format or existence
SP2-0611: Error enabling EXPLAIN report
SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
SP2-0611: Error enabling STATISTICS report

2、解决方法:

a.以SYS用户运行plustrce.sql脚本

cd $ORACLE_HOME/sqlplus/admin

oracle>sqlplus \'/ as sysdba\';
SQL>@plustrce.sql

b.给任何想使用Autotrace的用户授PLUSTRACE权限。

SQL>grant plustrace to hr;

c.同时被授权的用户比如hr用户的PLAN_TABLE这个表必须存在。如果不存在这样:

cd $ORACLE_HOME/sqlplus/admin

oracle>sqlplus hr/hr; --hr为示例用户
SQL>@utlxplan.sql

二、设置Autotrace的命令。

序号 命令 解释
1 SET AUTOTRACE OFF 此为默认值,即关闭Autotrace
2 SET AUTOTRACE ON EXPLAIN 只显示执行计划
3 SET AUTOTRACE ON STATISTICS 只显示执行的统计信息
4 SET AUTOTRACE ON 包含2,3两项内容
5 SET AUTOTRACE TRACEONLY 与ON相似,但不显示语句的执行结果。

三、Autotrace执行计划的各列的涵义

序号 列名 解释
1 ID_PLUS_EXP 每一步骤的行号
2 PARENT_ID_PLUS_EXP 每一步的Parent的级别号
3 PLAN_PLUS_EXP 实际的每步
4 OBJECT_NODE_PLUS_EXP Dblink或并行查询时才会用到

四、AUTOTRACE Statistics常用列解释

序号 统计列 解释
1 db block gets 从buffer cache中读取的block的数量
2 consistent gets 从buffer cache中读取的undo数据的block的数量
3 physical reads 从磁盘读取的block的数量
4 redo size DML生成的redo的大小
5 sorts (memory) 在内存执行的排序量
7 sorts (disk) 在磁盘上执行的排序量

五、示例

oracle@yang:~> sqlplus hr/hr

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Apr 12 15:46:56 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL>set autotrace on;

SQL> select b.DEPARTMENT_NAME,sum(a.SALARY)
2 from employees a,departments b
3 where a.DEPARTMENT_ID=b.DEPARTMENT_ID
4 group by b.DEPARTMENT_NAME
5 /

DEPARTMENT_NAME SUM(A.SALARY)
------------------------------ -------------
Accounting 20300
Administration 4400
Executive 58000
Finance 51600
Human Resources 6500
IT 28800
Marketing 19000
Public Relations 10000
Purchasing 24900
Sales 304500
Shipping 156400

11 rows selected.

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
42 consistent gets
0 physical reads
0 redo size
678 bytes sent via SQL*Net to client
498 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
11 rows processed

SQL> set autotrace on
SQL> /

DEPARTMENT_NAME SUM(A.SALARY)
------------------------------ -------------
Accounting 20300
Administration 4400
Executive 58000
Finance 51600
Human Resources 6500
IT 28800
Marketing 19000
Public Relations 10000
Purchasing 24900
Sales 304500
Shipping 156400

11 rows selected.

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=25 Card=27 Bytes=621
)

1 0 SORT (GROUP BY) (Cost=25 Card=27 Bytes=621)
2 1 HASH JOIN (Cost=21 Card=106 Bytes=2438)
3 2 TABLE ACCESS (FULL) OF \'DEPARTMENTS\' (Cost=10 Card=27
Bytes=432)

4 2 TABLE ACCESS (FULL) OF \'EMPLOYEES\' (Cost=10 Card=107 B
ytes=749)


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
42 consistent gets
0 physical reads
0 redo size
678 bytes sent via SQL*Net to client
498 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
11 rows processed

SQL> edit
Wrote file afiedt.buf

1 select b.DEPARTMENT_NAME,sum(a.SALARY)
2 from employees a,departments b
3 where a.DEPARTMENT_ID=b.DEPARTMENT_ID
4* group by b.DEPARTMENT_NAME
SQL> /

DEPARTMENT_NAME SUM(A.SALARY)
------------------------------ -------------
Accounting 20300
Administration 4400
Executive 58000
Finance 51600
Human Resources 6500
IT 28800
Marketing 19000
Public Relations 10000
Purchasing 24900
Sales 304500
Shipping 156400

11 rows selected.

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=25 Card=27 Bytes=621
)

1 0 SORT (GROUP BY) (Cost=25 Card=27 Bytes=621)
2 1 HASH JOIN (Cost=21 Card=106 Bytes=2438)
3 2 TABLE ACCESS (FULL) OF \'DEPARTMENTS\' (Cost=10 Card=27
Bytes=432)

4 2 TABLE ACCESS (FULL) OF \'EMPLOYEES\' (Cost=10 Card=107 B
ytes=749)


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
42 consistent gets
0 physical reads
0 redo size
678 bytes sent via SQL*Net to client
498 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
11 rows processed

SQL>
### Autotrace 的功能与使用方法 AutotraceOracle 数据库提供的一种诊断工具,用于帮助数据库管理员 (DBA) 和开发人员分析 SQL 查询的性能。通过启用 Autotrace 功能,可以查看 SQL 语句的执行计划以及统计信息,从而更好地理解查询的工作方式并对其进行优化。 #### 启用 Autotrace 要在 SQL*Plus 中启用 Autotrace 功能,可以通过以下命令实现: ```sql SET AUTOTRACE ON; ``` 此命令会显示 SQL 语句的执行计划和统计数据[^1]。如果仅希望查看执行计划而不展示详细的统计数据,则可使用以下命令: ```sql SET AUTOTRACE TRACEONLY EXPLAIN; ``` 同样地,若只想获取统计数据而无需执行计划,可以运行如下命令: ```sql SET AUTOTRACE TRACEONLY STATISTICS; ``` 以上设置均适用于当前会话,在关闭 SQL*Plus 或重新启动新会话时需再次配置。 #### 查看效果 当 Autotrace 被激活后,每次执行 SELECT 语句都会自动打印其对应的执行计划及相关性能指标。这些数据有助于识别潜在瓶颈所在位置,比如全表扫描、索引缺失或者低效连接操作等问题。 需要注意的是,虽然 Autotrace 提供了非常有价值的反馈信息,但它也会增加一定的开销因为要收集额外的信息所以对于生产环境中的大规模复杂查询可能并不适合频繁开启它来进行日常调试工作而是应该有针对性的选择性应用。 ```sql -- 示例:简单查询及其输出结果演示 SELECT * FROM employees WHERE department_id = 50; Execution Plan ---------------------------------------------------------- Plan hash value: xxxxxxxxxxxxx ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 12 | 648 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL | EMPLOYEES | 12 | 648 | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPARTMENT_ID"=50) Statistics ---------------------------------------------------------- 12 recursive calls 0 db block gets 100 consistent gets 10 physical reads 0 redo size 12345 bytes sent via SQL*Net to client 6789 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 12 rows processed ``` 上述例子展示了如何利用 Autotrace 来观察一条具体查询背后的操作细节及资源消耗情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值