oracle执行计划获取的几种方式(二)

2014-11-24 16:18:20 · 作者: · 浏览: 1
---------------------------------
| 0 | SELECT STATEMENT | | 1 | 133 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| BOOK_INFO | 1 | 133 | 2 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_BOOK_BOOK_INFO_ID | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
2 - access("ID"=10270)

SQL> explain plan set statement_id='t1' for select * from book_info where id=20360;
SQL> select * from table(dbms_xplan.display(null,'t1'));

PLAN_TABLE_OUTPUT
Plan hash value: 1409354130

----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 133 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| BOOK_INFO | 1 | 133 | 2 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_BOOK_BOOK_INFO_ID | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
2 - access("ID"=20360)
关于format参数:
select * from table(dbms_xplan.display(null,null,'basic'));


3.AWR
由于10g以后自动安装AWR收集信息,所以可以通过dbms_xplan包提供的display_awr函数来查看AWR抽取SQL的计划。
这里是通过sql_id参数传入的进行查看。
举例:
select * from table(dbms_xplan.display_awr('xxxxxxxx'));
这里初步介绍下,就不再深入各个参数。

4.事件跟踪,比如10046,10053等
sql_trace
会话跟踪alter session set sql_trace=true;--跟踪当前会话,false为结束跟踪
当然也可以跟踪其他会话的
select sid,serial#,username from v$session.......根据自己需求查出sid,serial#,进行下一步跟踪
exec dbms_system.set_sql_trace_in_session(sid,serial#,true); --开始
exec dbms_system.set_sql_trace_in_session(sid,serial#,false) ; --结束
这种方法是不显示绑定信息和等待事件的,如果要全面信息,需要设置events等级,也就是10046事件
alter session set events '10046 trace name context forever,level 12';
level 1:跟踪sql语句,包括解析、执行、提取、提交和回滚等。
level 4:包括变量的详细信息
level 8:包括等待事件
level 12:包括绑定变量与等待事件
alter session set evevts '10046 trace name context off'; 结束跟踪
还有就是dbms_system的set_ev过程也是可以的。另外再10g中有了dbms_monitor可以用来跟踪。
查出跟踪文件:
alter session set tracefile_identifier='xxxxxx';
设定标识,以便查找,默认路径在是udump下面,11G路径当然有些变化是在,$ORACLE_BASE\diag\rdbms\orcl\orcl\trace下面
也可以通过一下SQL直接定位
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc'
AS "trace_file_name"
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statisti c# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d;
或者
SET LINESIZE 100
COLUMN trace_file FORMAT A60

SELECT s.sid,
s.serial#,
pa.value || '/' || LOWER(SYS_CONTEXT('userenv','instance_name')) ||
'_ora_' || p.spid || '.trc' AS trace_file
FROM v$session s,
v$process p,
v$parameter pa
WHERE pa.name = 'user_dump_dest'
AND s.paddr = p.addr
AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
找出文件,那么可以使用TKPROF查看了。TKPROF这里不再讲解

5.通过第三方工具toad PL/SQL Developer
这个相信基本都用过,比较方便PL/SQL Develop