|
一.在线查看执行计划表 S1 g P* s, F8 Y4 D: s' x/ ~
9 {5 C7 c" W) z: Q" z) ` @% Y" j% @ 如果PLAN_TABLE表不存在,执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建plan_table表。
" M' K' k0 o7 x% J9 W: F3 S/ l7 e: q( x1 ]6 ]' X- s+ K
1.explain plan
" z5 T, m2 Y% L( ?
, p1 w+ G: I+ E9 O/ L( D1 ]8 [ for
8 L+ q4 c L1 @' k2 x" K
7 ~! O& a0 q) o" r& Y, S select * from ......
a, S! T2 l) [
. ~- Z4 Y2 g; v9 v( z/ N | 2.select * from table(DBMS_XPLAN.Display);0 e- m F$ z* A( }
7 H, |" I" N6 I8 A$ p/ n
二.使用oracle第三方工具:
7 h$ C% o6 W! J% a
o8 d2 J$ @) A' @9 D6 S! Q# g plsql developer(F5)
$ P( q5 C' l+ Y0 Y$ r4 E
0 B, N8 w: X) B O Toad (Ctrl+E)0 T2 q, c) g+ i, w. i
0 d5 [) y8 X7 c# d2 `- [$ K
三.使用SQL*PLUS:
3 ^9 V& @7 o: b- v l7 Q
0 J2 Y/ R* l- H! e5 n% |7 V' A 如果PLAN_TABLE表不存在,执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建plan_table表。
5 x N7 X8 F! L; r: O) }2 L6 q6 g; s# t5 `# _, a/ g4 ]+ f& n
如果PLUSTRACE角色不存在,执行
' t! ]% x$ E" R- B6 `- v, s) N+ C* j0 G r1 p W
$ORACLE_HOME/sqlplus/admin/plustrce.sql' i i9 b i, k6 b0 b4 Y
# H5 ^) h! k. n0 A
1.sqlplus / as sysdba
* W2 X9 u- U+ G# H" v$ E" J% N& O. z0 S8 s& f/ p1 h
set autotrace on;
* B' q" }- d1 u% D2 k
7 }, x7 ?: C8 g 关于Autotrace几个常用选项的说明:
, a U/ E. H% V* {: P& e8 p! J8 t7 J( e1 z* N) Z% k/ v
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
, u# X$ r1 E) ~% p/ j* }2 v4 `# j* X; K* m9 Y3 _
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
' _9 b' J1 `# F6 v
! E* K' W7 r8 v6 l9 A SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息0 N" M: p- q6 |2 R$ J7 n$ ?3 X
) @0 g1 y7 Q# X! K1 s1 V4 j: n- Q
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息+ D8 F1 c [; S. v1 [, y
& V9 [4 s0 D- z9 W
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询
5 ?/ w5 c0 Y0 @6 [ y! ^0 E K/ a" s2 D: \0 z4 r( D
2.执行sql
. Y5 n/ }1 q/ ?( o4 N7 U: u U. W% W8 Q
四.sql trace$ N: L5 M- Q' ~- ^( E& U: Z7 L
) h8 z9 q" A3 @! J8 ^9 w0 h
1.alter session set sql_trace=true;
$ R- O3 u) A. |" k
% F# q4 d1 V: c1 w 2.执行sql8 c* U0 m4 [" T7 u
* H3 @0 z' M3 p: Y* o6 a, t' U
3.alter session set sql_trace=false;% _9 @0 @. }+ l% a, f/ V
8 g }" _+ `3 G# Z; q W4 @1 [ 4.查看相应的sql trace文件。/ ~/ e* E: ?# \: a& X
' D% U! T+ k. D: `% d0 }. _6 y 五.诊断事件(10046)1 K1 K; f1 M5 t+ | H3 q
/ {$ b" W- I" L5 }* w$ B; l
1.alter session set events '10046 trace name context forever,level 12';# a: O5 r% N# z4 F6 i8 l+ r9 u
$ L: H4 t# f) Z& O$ } 2.执行sql
; ]5 c: ^7 ?& C% H! J0 l' v# y9 S
3.alter session set events '10046 trace name context off';
$ i. @2 h- \+ t) {: @( s3 d, V4 {* M6 }1 B: I" M; L
3.查看相应的sql trace文件。, |0 G- R4 U$ A8 ]& ?1 `) k0 U9 B" f2 L/ S
$ Q0 g3 G# `7 d" |
可利用TKPROF工具查看跟踪文件
) S7 C2 C5 E' I6 j* ^6 @7 j3 s( S
. m; J3 t0 T+ @" y TKPROF是一个用于分析oracle跟踪文件并且产生一个更加清晰合理的输出结果的可执行工具。如果一个系统的执行效率比较低,一个比较好的方法是跟踪用户的会话并且使用TKPROF工具的排序功能格式化输出,从而找出有问题的SQL语句。
. w8 x$ R! y, T- i
# o: X. l! U. w0 ?7 \( e( @0 j% ] TKPROF命令后面的选项及输出文件各个列的含义在这里不做详细的介绍。google一下就会有很多资料。; X4 z1 i1 G4 ~, Q/ V- R, A
$ S \: d l; `# g# F& a
下面简单描述一下TKPROF工具的使用步骤:5 B+ c) \7 s" Y; f8 P
& h5 g, Q3 ]9 u$ i7 I# M, n# ]! l' L! o
1、在session级别设置sql_trace=true. B* [) [- c0 ]/ x j2 A/ |2 ~! u# O
# J: L0 M `1 w/ g1 ]4 \ alter">sys@ORCL>alter session set sql_trace=true;3 R4 c3 y- C5 E- l/ u
/ W- S: {0 p" H, Y$ p
Session altered.
: y( N* W6 `: @& s; C
+ ^% r1 E; P4 O3 f( ~/ U- F* F 如果要在pl/sql中对session级别设置true,可以使用dbms_system这个包:- A2 u4 L0 k; Z: ?
! J( I! e6 N; b+ y: C
sys@ORCL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true);% H9 j3 J; u# v" ]( f
, w* H1 n- D; b2 D4 C/ E 2、指定一下生成的trace文件的名字,便于查找:
7 N1 ~: m c, u$ n
9 A4 V* c# [+ t' Y alter">sys@ORCL>alter session set trace file_identifier='yourname';
" p6 \6 K! H3 I+ R2 ~" u8 }
5 `$ C" F7 _' J$ o 3、执行SQL语句。% J3 {) ]# E7 v8 w
8 g) w/ u. n X
4、利用TKPROF工具格式化输出的trace 文件:, R+ B8 B$ u$ U! A
6 b$ _6 H4 R& _0 {+ ]" w- U [oracle@q1test01~] $tkprof/oracle/admin/orcl/udump/orcl_ora_10266_yourname.trc/oracle/yourname.txtexplain=user/pwdaggregate=yessys=nowaits=yessort=fchela( H/ a5 Y$ Z! \
, m" _& L6 J% h4 ?* [) U
5、查看生成的文件再设置sql_trace=false:
- _9 m; m) u: ?) g8 i) n+ }% |" X6 N' S: o
alter">sys@ORCL>alter session set sql_trace=false; |
|