|
一.在线查看执行计划表1 u4 [& {/ e/ s; A
* {9 m- u m6 y6 D2 p
如果PLAN_TABLE表不存在,执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建plan_table表。
: Q# V* j- h5 S1 R) S
+ C: F1 H5 j/ j 1.explain plan" z8 f) v0 v" a7 [
9 u, x0 h2 ?; }2 b3 i
for! t; l, I" y) ^+ v( P: ~" J
5 _& u$ \" _2 |: I3 `7 V0 p
select * from ......7 C# _/ k0 `; q$ Z) _8 g1 K( _: ]5 e/ h
6 i+ ?" M8 u U$ y t. l
2.select * from table(DBMS_XPLAN.Display);
; l% N8 x0 f3 k+ {+ F7 R$ p: D( n
二.使用oracle第三方工具:) b. a' Q- M' _# V4 ~
8 t& ]6 ?6 Q9 m2 f plsql developer(F5)( X) p3 G" a8 x# o
" m7 z1 o# b. l( a6 _; X Toad (Ctrl+E)
0 S7 x0 I+ f- E: U3 z t4 z5 R
4 q" z: X" c. W. V5 e" i1 K4 ]( ] 三.使用SQL*PLUS:/ Z4 e3 @7 {, q$ i9 ~6 g9 v
9 _; _/ A4 U$ o9 B1 i+ X 如果PLAN_TABLE表不存在,执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建plan_table表。" y" x0 X* A4 i/ E1 n' k6 B! H
n- n( d: }9 q4 \
如果PLUSTRACE角色不存在,执行: L+ x6 [/ ^2 A2 X
; P( `4 m4 n/ b" r/ y, ?, `% U& Q
$ORACLE_HOME/sqlplus/admin/plustrce.sql: C) Q5 @. [* F: |5 W6 C1 q" i8 G
9 g3 h) z2 x$ m9 i
1.sqlplus / as sysdba- ^! H( S, { N# ^. F
! ]+ r) I7 O% o0 E( I9 ^( x
set autotrace on;+ a. \0 F/ K' y ~; A+ Q. {, d5 K
4 H9 s9 G* ?/ N1 E( x: O 关于Autotrace几个常用选项的说明:
, Y8 t" W* T0 m8 g* X5 ]& [/ o& r" z
* X9 w! c' [0 o3 B" g1 Z- s" k: q SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式; G P; B$ j! I) S v/ T
4 f, m* K6 Q; _0 q1 ?- ^1 K+ P
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告5 v5 z; s* |; F, O! Z
+ w l5 U6 J4 H4 l% \ SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
6 \" L, D" ^0 ~
& J- v! V% U$ W5 } SET AUTOTRACE ON ----------------- 包含执行计划和统计信息+ g' C; x8 {+ D* O0 m
* E- H2 m( R/ U7 b SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询
6 s% T8 Z1 s1 @* V: h. m( n
# d s! b# X( R# c9 f3 `; x2 l: y 2.执行sql
* o9 L3 K* A+ ?2 F, ^ ], Y; L; C0 ^7 \- ?2 `! R5 v0 O
四.sql trace
% n: z& ]* [' T, _6 Z; [# f6 w2 V9 z E( a9 |5 _1 S
1.alter session set sql_trace=true;2 C. M4 m, R" o
$ X& U/ l* q Y/ B3 q2 M
2.执行sql* ^4 {8 s0 N& Q8 S
: |1 w4 E% {, d+ j8 E4 V 3.alter session set sql_trace=false;" o( D$ p- @1 X
! |% b8 m- ]+ ]" r 4.查看相应的sql trace文件。# A3 T# Q8 p3 U q
# h$ M$ ]: Y' L. f% j' V 五.诊断事件(10046)* b" Z+ g/ @5 `4 _# M
5 I" X$ c( M8 a% J. h; M; p5 B
1.alter session set events '10046 trace name context forever,level 12';
+ v1 I1 c: I4 j2 P8 b5 _$ _
1 s: Z$ _( K, G' W 2.执行sql
. P$ l4 f B! Z$ J: G
" c) L, i( ~( k 3.alter session set events '10046 trace name context off';+ q& [) g( L# N2 k
. Y) o6 |2 o ~5 d; T
3.查看相应的sql trace文件。
3 ?( F) K' u5 A" E% h( z) r6 K
: \1 Y q: k# D4 N) p 可利用TKPROF工具查看跟踪文件
; S3 E# b5 `8 X; o: n6 F0 V& R6 w$ R
8 |% t# S w! k, ?8 O, N r; p/ Y TKPROF是一个用于分析oracle跟踪文件并且产生一个更加清晰合理的输出结果的可执行工具。如果一个系统的执行效率比较低,一个比较好的方法是跟踪用户的会话并且使用TKPROF工具的排序功能格式化输出,从而找出有问题的SQL语句。' W6 j \* P" c( L% l
( C$ U' X0 Q* C L5 B, C6 J) { TKPROF命令后面的选项及输出文件各个列的含义在这里不做详细的介绍。google一下就会有很多资料。
V0 F E0 \' Y9 Y0 `2 T! `
. [- g2 }! u) Y, J9 d1 v* I 下面简单描述一下TKPROF工具的使用步骤:
! L9 [5 ]9 l0 C: W
' R' \! c: p$ K 1、在session级别设置sql_trace=true
7 p' c8 |% L: ^
/ p0 B) N( l0 D, @/ @ alter">sys@ORCL>alter session set sql_trace=true;
* ], V. a7 Z6 l4 P7 j, h. m' o$ d0 E2 ~- e" u [
Session altered.
9 c* G# @5 n5 @8 Z7 C6 S7 O/ x6 d; ]) `1 I. Q: r: ?7 k
如果要在pl/sql中对session级别设置true,可以使用dbms_system这个包:
: g" f1 A3 Q) s# S9 X
( @! H" b0 c7 s+ w- L O; J4 i: ^" h sys@ORCL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true);
) R2 r3 @; \! F& m; ]: y' G
) }$ o& C2 i% B: f 2、指定一下生成的trace文件的名字,便于查找:2 Y1 T& T# i- V3 K
! R+ ?- `7 c+ N- }
alter">sys@ORCL>alter session set trace file_identifier='yourname';4 Z! x4 l& E9 N$ i+ w- S
/ }+ A4 X5 \ O" f9 `0 {6 _- I. @
3、执行SQL语句。
5 R* `6 n3 I$ Z; w5 C& u6 o, _" g+ ~+ |& t% B# [3 s4 h1 m
4、利用TKPROF工具格式化输出的trace 文件:
! X3 z3 `1 }" c; C8 a/ a) c
5 \" S/ M: f( h$ U6 a8 V. p [oracle@q1test01~] $tkprof/oracle/admin/orcl/udump/orcl_ora_10266_yourname.trc/oracle/yourname.txtexplain=user/pwdaggregate=yessys=nowaits=yessort=fchela
1 t! }4 X6 ]- U; U6 P
! N; N& j1 A- Y1 {( q 5、查看生成的文件再设置sql_trace=false:
# ]+ K4 `) r* R B- C7 l- I/ Y3 D- k9 n1 U
alter">sys@ORCL>alter session set sql_trace=false; |
|