| « | 六月 2008 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | ||||||
EXPLAIN
PLAN
Explain Plan语句能够显示优化器对SELECT,UPDATE,INSERT,DELETE等语句分析的执行计划.一条语句的执行计划是Oracle运行SQL的顺序.行源树是执行计划的核心,主要包含下列信息:
Ø
参考表的顺序
Ø
每个表的访问方式
Ø
表的连接方式
Ø
最佳化:成本和基数
Ø
分区
Ø
并行化
创建PLAN_TABLE表
|
@C:UserDefineoracleora92rdbmsadminutlxplan.sql; |
运行PLAN_TABLE
|
SQL> explain
plan 2 set
statement_id='test' for 3
select * from testindex where object_type='JAVA
CLASS'; Explained |
显示PLAN_TABLE表输出
|
SQL>
@C:UserDefineoracleora92rdbmsadminutlxpls.sql; SQL> select * from
table(dbms_xplan.display()); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (% -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 895 | 76075 | 27 | 1 |
TABLE ACCESS BY INDEX ROWID| TESTINDEX |
895 | 76075 |
27 |* 2 |
INDEX RANGE SCAN |
OBJECTTYPEINDEX | 895 |
| 2 -------------------------------------------------------------------------------- Predicate Information
(identified by operation id): --------------------------------------------------- 2 - access("TESTINDEX"."OBJECT_TYPE"='JAVA
CLASS') 13 rows
selected |
自定义PLAN_TABLE表输出
|
SELECT lpad('
',level-1)||operation||' '||options||' '||object_name "Plan" |
PLAN_TABLE表输出
|
Plan -------------------------------------------------------------------------------- SELECT
STATEMENT TABLE ACCESS BY INDEX ROWID
TESTINDEX |
SQL
Trace
SQL Trace提供了每一条SQL语句的性能信息,产生下列统计信息:
Ø
分析,执行和fetch数量
Ø
CPU和消耗时间
Ø
物理读和逻辑读
Ø
处理的记录数
Ø
库缓存的缺失数
你可以在会话或者实例级别上增强SQL Trace跟踪.
TKPROF
你能够使用TKPROF程序格式化跟踪文件的内容,把输出写入一个易于理解的文件中,此外,TKPROF也能够完成以下:
Ø
决定SQL语句的执行计划
Ø
在数据库中创建一个存储统计的SQL脚本
SQL Trace和TKPROF的步骤
1.
设置跟踪文件管理的初始化参数
TIMED_STATISTICS 启用或屏蔽时间统计的收集,例如CPU和消耗时间
MAX_DUMP_FILE_SIZE 文件的最大行数,缺省为500
USER_DUMP_DEST 跟踪文件的目录
2.
增强SQL Trace跟踪,运行应用程序
使用DBMS_SESSION.SET_SQL_TRACE
存储过程
ALTER SESSION SET
SQL_TRACE=TRUE;
3.
运行TKPROF转换SQL Trace文件到一个易于阅读的输出文件中.
TKPROF filename1
filename2
4.
解译输出文件
5.
运行SQL script把统计信息存储到数据库中.
SQL
Trace和TKPROF全过程
显示系统设置参数并产生Trace文件
|
SQL> show parameters
TIMED_STATISTICS; NAME TYPE VALUE ------------------------------------
----------- ------------------------------ timed_statistics boolean TRUE SQL> show parameters
MAX_DUMP_FILE_SIZE; NAME TYPE VALUE ------------------------------------
----------- ------------------------------ max_dump_file_size string UNLIMITED SQL> show parameters
USER_DUMP_DEST; NAME TYPE VALUE ------------------------------------
----------- ------------------------------ user_dump_dest string
C:UserDefineoracleadminwbqudump SQL> ALTER SESSION
SET SQL_TRACE=TRUE; Session
altered SQL> select
owner,object_name from testindex where
object_type='CONTEXT'; OWNER
OBJECT_NAME ------------------------------
-------------------------------------------------------------------------------- SYS LT_CTX SYS
WK$CONTEXT |
使用TKPROF格式化输出文件
|
C:>CD
C:UserDefineoracleadminwbqudump C:UserDefineoracleadminwbqudump>TKPROF
wbq_ora_4868.trc output.txt TKPROF: Release
9.2.0.1.0 - Production on Sat May 12 01:50:43 2007 Copyright (c) 1982,
2002, Oracle Corporation. All rights
reserved. C:UserDefineoracleadminwbqudump>more
|output.txt |
阅读并分析格式化报表
|
TKPROF: Release
9.2.0.1.0 - Production on Sat May 12 01:50:43 2007 Copyright (c) 1982,
2002, Oracle Corporation. All rights
reserved. Trace file:
wbq_ora_4868.trc Sort options:
default ******************************************************************************** count = number of times OCI procedure was
executed cpu = cpu time in seconds executing
elapsed = elapsed time in seconds
executing disk = number of physical reads of buffers from
disk query = number of buffers gotten for consistent
read current = number of buffers gotten in current mode
(usually for update) rows = number of rows processed by the fetch or
execute call ******************************************************************************** select *
from testindex where
object_type='CONTEXT' call count cpu
elapsed disk query
current
rows ------- ------ -------- ---------- ---------- ----------
----------
---------- Parse 2
0.00 0.00 0 0 0 0 Execute 2
0.00 0.00 0 0 0 0 Fetch 2
0.00 0.00 0 8 0 4 ------- ------ -------- ---------- ---------- ----------
----------
---------- total 6
0.00 0.00 0 8 0 4 Misses in library cache
during parse: 1 Optimizer goal:
CHOOSE Parsing user id:
61 Rows Row Source Operation -------
--------------------------------------------------- 2
TABLE ACCESS BY INDEX ROWID TESTINDEX 2
INDEX RANGE SCAN OBJECTTYPEINDEX (object id 30527) |
Autotrace
Report
|
Autotrace
Setting |
结果 |
|
SET AUTOTRACE
OFF |
没有自动跟踪报告(系统缺省) |
|
SET AUTOTRACE ON
EXPLAIN |
输出执行结果和优化器执行计划 |
|
SET AUTOTRACE ON
STATISTICS |
输出执行结果和SQL语句统计信息 |
|
SET AUTOTRACE
ON |
输出执行结果,优化器执行计划和SQL语句统计信息 |
|
SET AUTOTRACE
TRACEONLY |
仅仅输出优化器执行计划和SQL语句统计信息,不输出结果 |
样例
SQL*Plus: Release
9.2.0.1.0 - Production on Sat May 12 02:16:18 2007
Copyright (c) 1982,
2002, Oracle Corporation. All rights
reserved.
SQL> connect
wbq/wbq;
Connected.
SQL> SET AUTOTRACE
OFF;
SQL> SELECT
OWNER,SUBSTR(OBJECT_NAME,1,20) OBJECT_NAME
2
FROM TESTINDEX
3
WHERE OBJECT_TYPE='CLUSTER';
OWNER OBJECT_NAME
------------------------------
--------------------
SYS
C_COBJ#
SYS
C_FILE#_BLOCK#
…
10 rows
selected.
SQL> SET AUTOTRACE
ON;
SQL> SELECT
OWNER,SUBSTR(OBJECT_NAME,1,20) OBJECT_NAME
2
FROM TESTINDEX
3
WHERE OBJECT_TYPE='CLUSTER';
OWNER
OBJECT_NAME
------------------------------
--------------------
SYS
C_COBJ#
SYS
C_FILE#_BLOCK#
…
10 rows
selected.
Execution
Plan
----------------------------------------------------------
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=27 Card=895
Bytes=32220)
1
0 TABLE ACCESS (BY INDEX ROWID)
OF 'TESTINDEX' (Cost=27 Card=895 Bytes=32220)
2
1 INDEX (RANGE SCAN) OF
'OBJECTTYPEINDEX' (NON-UNIQUE) (Cost=2 Card=895)
Statistics
----------------------------------------------------------
0
recursive calls
0
db block gets
6
consistent gets
0
physical reads
0
redo size
614
bytes sent via SQL*Net to client
499
bytes received via SQL*Net from client
2
SQL*Net roundtrips to/from client
0
sorts (memory)
0
sorts (disk)
10
rows processed
SQL> SET AUTOTRACE
TRACEONLY;
SQL> SELECT
OWNER,SUBSTR(OBJECT_NAME,1,20) OBJECT_NAME
2
FROM TESTINDEX
3
WHERE OBJECT_TYPE='CLUSTER';
10 rows
selected.
Execution
Plan
----------------------------------------------------------
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=27 Card=895
Bytes=32220)
1
0 TABLE ACCESS (BY INDEX ROWID)
OF 'TESTINDEX' (Cost=27 Card=895 Bytes=32220)
2
1 INDEX (RANGE SCAN) OF
'OBJECTTYPEINDEX' (NON-UNIQUE) (Cost=2 Card=895)
Statistics