|
一.在线查看执行计划表
$ w* L3 W. A& t) A4 ~8 A% M
% [; P6 X. r6 a9 E$ f# t 如果PLAN_TABLE表不存在,执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建plan_table表。
. i/ Y; B# _: ?* |3 p1 ^& a* K! z' ?" s% G5 M- }2 W
1.explain plan% E! H" t0 b( T" a" ?
, x# r' h3 v* f# t/ N. B1 z' N, l
for
7 P" e& }2 p6 j6 k$ E! Z1 s9 I, k6 c/ w0 l& m; h \* h
select * from ......' m" t5 q3 Y4 ]+ |) k8 L5 i, Y# t
- }7 Q7 e( Z( @0 O7 ?2 \3 t7 `* k0 D6 R
2.select * from table(DBMS_XPLAN.Display);( ?+ j( s% |0 _: k9 @$ ]5 p4 N' R8 _4 j
" d5 h0 f* X- v' Q& D 二.使用oracle第三方工具:
C& a/ p$ s6 V: A/ D( o% A4 G; A, a' j4 g) @1 h
plsql developer(F5)+ P0 O* f8 a& ?$ U
( H' K( r9 b1 E, s2 Z Toad (Ctrl+E)
+ g: d$ m" _5 x4 e/ f" s% z
, \. {4 V8 P$ m# E7 @1 ]7 ^ 三.使用SQL*PLUS:
* b5 T" y: D1 C
# u- l1 U) O1 z" k6 q 如果PLAN_TABLE表不存在,执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建plan_table表。1 c1 c2 H0 V' N; O: u8 l
/ i6 E* _5 v; i$ o: |
如果PLUSTRACE角色不存在,执行
4 L6 d( `5 B. L5 ?' F' y3 [' y0 P3 g
$ORACLE_HOME/sqlplus/admin/plustrce.sql
: J1 J" G% \5 w% u K# c8 i2 k" Z! |' g" t$ j' F& p) F. J
1.sqlplus / as sysdba" j! ~, l3 C/ I$ J
; [" f/ m7 C; [9 [7 T5 Q; Y% @ set autotrace on;
- I" A2 t4 z2 f, ?8 H
7 p* o5 o' n- U" u- x2 I1 e- G 关于Autotrace几个常用选项的说明:# T( n I- Y, D H. a
/ V: s2 | b8 r# f
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式6 i7 d8 E5 g2 X1 }) s8 U9 \9 R
% ?- R" U( ?. H8 s) K3 a
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
& Y; S' w( a( W
- n5 }# K4 }# ^" ?7 ?6 I SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息& @: C& |$ {/ K$ ?; T1 z" ~
- C2 \2 O! R U& T" u SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
' ]1 N* o* A4 g( K8 m9 F$ e. v" n$ [ j0 b% b9 O% h
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询7 a8 H. P* r: o% }- a }) P7 e
" `9 ~& F: p# m( U* F. o 2.执行sql$ [: z* q0 o; o6 g3 Q0 ?
* B' R4 Y1 T) {% N# a+ v
四.sql trace
; S& X' Z' F& f
/ \4 {' p L6 p9 Q( a0 B' l- ~% G! E 1.alter session set sql_trace=true;* o4 m; A( J/ @8 q6 h
7 M/ f9 X2 \) l ^% M- H: u# o1 w& Z 2.执行sql$ J0 J7 f4 W* B% K
/ ~! Z% Y! W6 L8 @. S P) U
3.alter session set sql_trace=false;
5 X6 T2 [8 a8 s/ P* U* g! f: p) h' C8 n$ ^! f% J4 b' x
4.查看相应的sql trace文件。
+ z! f0 j& l, ]7 V
X$ h# X y9 ]) Z/ k8 X1 i 五.诊断事件(10046)/ P9 U4 z1 z- J/ a9 i A' L
' G* U2 C; p; P8 f5 |7 p4 I 1.alter session set events '10046 trace name context forever,level 12';+ Y7 l9 ?; _, g# c
; W( |1 c/ X, e2 ^) ?9 |. {8 A 2.执行sql
. q* l5 T, z9 |1 `; R, O' t2 b" }. a
3.alter session set events '10046 trace name context off';5 Q% ?5 }" E, v7 o( V7 Z! c
( v% B7 _7 q/ m& R5 y" N 3.查看相应的sql trace文件。 Z N( v3 w, b" ]' F c5 w
" q) V1 l% [. u/ [# o+ `6 e 可利用TKPROF工具查看跟踪文件/ Y& G. ]3 [( ?) ]4 B) V
. r% m& H: r4 n TKPROF是一个用于分析oracle跟踪文件并且产生一个更加清晰合理的输出结果的可执行工具。如果一个系统的执行效率比较低,一个比较好的方法是跟踪用户的会话并且使用TKPROF工具的排序功能格式化输出,从而找出有问题的SQL语句。
8 ^1 m% Y) }* R- I. c1 h7 X2 G6 h i: e0 V5 P: L
TKPROF命令后面的选项及输出文件各个列的含义在这里不做详细的介绍。google一下就会有很多资料。' D+ s& v [3 U' u* n; s! S1 Y
$ ~! z) i7 s/ z5 R* e
下面简单描述一下TKPROF工具的使用步骤:
+ O) M9 d& V3 o% Q% e$ L# M, C* \ F4 R* X
1、在session级别设置sql_trace=true
l# Z S& T2 ?9 b; O8 l
! q5 S9 Y/ m T8 N0 y; } alter">sys@ORCL>alter session set sql_trace=true;
K: h# Y* w% z) ], u: `* M# }0 W* G" |5 I- Y4 K$ Q
Session altered.: M& U( a3 i3 h' P( @: G
) A+ F- t1 G; F. Y Q4 F6 ^
如果要在pl/sql中对session级别设置true,可以使用dbms_system这个包:
8 C# ^7 w: f' Q6 Z1 b
" I0 Y8 S% m* C6 a3 ^; t4 U0 ] sys@ORCL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true);
, L. [9 _6 U2 i: A/ R# y" E: V9 ~
+ G5 G" S! n. c8 ]! \; `$ d 2、指定一下生成的trace文件的名字,便于查找:
: x- j* d2 }' B4 ~ D% o6 C! n( {
+ Q4 _; G) I D6 Z alter">sys@ORCL>alter session set trace file_identifier='yourname';
1 f8 s0 T9 n3 r0 d4 v1 R, w/ ~% f; ]
* O6 {, p" z- L$ i' l2 J 3、执行SQL语句。! ?4 F- o1 f" r6 \* X5 Q
5 o$ K9 X2 T( z) P
4、利用TKPROF工具格式化输出的trace 文件:+ ?& i/ e$ g! P( V0 ^
% b0 n: W4 {- P4 {. p; H [oracle@q1test01~] $tkprof/oracle/admin/orcl/udump/orcl_ora_10266_yourname.trc/oracle/yourname.txtexplain=user/pwdaggregate=yessys=nowaits=yessort=fchela6 Q [2 e1 ]3 V! J/ F% r: R) ?
5 A' ?, H+ R% ?% n6 q$ r2 u
5、查看生成的文件再设置sql_trace=false:
% K4 @/ f; [2 O4 \% ^) s9 {' B* Q7 n0 n
alter">sys@ORCL>alter session set sql_trace=false; |
|