oracle如何查看执行计划
上一篇 / 下一篇 2011-06-02 18:32:24 / 个人分类:Oracle
)E*E'Zd'@ H$B0
9k#HS;a#x2m8|0 SQL> set autotrace on explain51Testing软件测试网c2|+WC[
SQL> select * from dual;
kI3Q7jY*Kky*D0 D
#G#`.?f8^5q6r(g%K0 -51Testing软件测试网C3u'@6S8TJB} K
X
f(@7X$V1P~:J0 Execution Plan51Testing软件测试网ou"`,y/nN!K/E8E
----------------------------------------------------------
'C}u-if S*Yiu^g-u#g,|0 Plan hash value: 272002086
pY gp~4Cr%G0 --------------------------------------------------------------------------
S9W4u"K2x D0 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
,J9g]hm/Vy0 --------------------------------------------------------------------------
[BN?Z&h@S0 | 0 | SELECT STATEMENT | | 1 | 2 | 2 (0) | 00:00:01 |
:L0mH R2G)m8F9o2u'k0 | 1 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 (0) | 00:00:01 |
#G\1O@;{ fA%h0 --------------------------------------------------------------------------51Testing软件测试网|+s5|;\j p
SQL> set autotrace off
7reh#t-G0GXD#{0 51Testing软件测试网'n8dqi4Ti3zY5{|
但是这样操作的结果是先执行SQL,再出执行计划,如果SQL耗时巨大,则不现实;
r} y1P%?4{~]hZ0
K,{)Qv%Q(U A02、使用explain plan for语句:
-u H0\OK[0 51Testing软件测试网!|lJ$o$plG
SQL> explain plan for select * from dual;51Testing软件测试网 v@,F:{2`e%]g
Explained.
y(i"a&v`t0 SQL> select * from table(DBMS_XPLAN.display);
#~"BOD h\0 Execution Plan51Testing软件测试网K Dg1YZsVS%g
----------------------------------------------------------
6Z)rR&A l*^ v#A0 Plan hash value: 2137789089
q9\5@z z#L|k$cP0 ---------------------------------------------------------------------------------------------51Testing软件测试网@6|k3H7}gc-M"U
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |51Testing软件测试网,oX6h LuV
---------------------------------------------------------------------------------------------51Testing软件测试网K~Ls8? M$K B~
| 0 | SELECT STATEMENT | | 8168 | 16336 | 21 (0)| 00:00:01 |51Testing软件测试网;z.tx\ lWib
| 1 | COLLECTION ITERATOR PICKLER FETCH| DISPLAY | | |
3J7j-bNs0 | |
Q!Q(v?h ozat0 ---------------------------------------------------------------------------------------------
9WC"\t9L#{!OF{ |N?0 51Testing软件测试网'x/t#oG5}
这样就可以在执行SQL之前查看执行计划了 51Testing软件测试网(w:H5nn-XX+E&|8]
e*j/ni-k-aD03、启用SQL_TRACE跟踪所有后台进程活动:51Testing软件测试网,P.P.p#`DzgP
51Testing软件测试网c7n @5Bdm
全局参数设置:
TrW'}:y)~9p Z4Yx:w0 ..OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
2imoFXX-n@0
)bt(Nr-C0 当前session中设置:51Testing软件测试网wtO.F6^5@a0P
SQL> alter session set SQL_TRACE=true;51Testing软件测试网J*q5w*F9^5`;FXcp
SQL> select * from dual;
nR"@+K;V6xk S2Q(k_0 SQL> alter session set SQL_TRACE=false;51Testing软件测试网Q}]:q DV
4os:D.S c#g0 对其他用户进行跟踪设置:51Testing软件测试网W%[OTmI8X
SQL> select sid,serial#,username from v$session where username='XXX';
ST3LBEF0 SID SERIAL# USERNAME
I8CF ?DT0 ------ ---------- ------------------51Testing软件测试网5R(aEU~ D6H(U
127 31923 A
T-`;F#K"j2UT0 128 54521 B51Testing软件测试网HG,@ ~ ~,K%BZT
129 48940 B51Testing软件测试网%QE,mdQO
SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
XyE&K;I'~H0 SQL> select * from dual;
_qOT'n0 SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);51Testing软件测试网w!VAD*EM"g:M
0~xcIJ+D,L2@u0 然后使用oracle自带的tkprof命令行工具格式化跟踪文件。 51Testing软件测试网hF h8E{,Zm h
51Testing软件测试网/hR;Q{6d6K
4、使用10046事件进行查询:
$Y;d(WX Ea8j0 51Testing软件测试网Dn3A)E9iK#l;f
10046事件级别:51Testing软件测试网8j;?j ^bo9p3W.A
Lv1 - 启用标准的SQL_TRACE功能,等价于SQL_TRACE
%ng ~URxb0 Lv4 - Level 1 + 绑定值(bind values)51Testing软件测试网0U${fcHu_
Lv8 - Level 1 + 等待事件跟踪
Er0_~D0 Lv12 - Level 1 + Level 4 + Level 851Testing软件测试网4t_j y_1w\ B-TI
.p$N0a9nkc S0 全局设定:
W1Uj"bC$Y0 ..OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"51Testing软件测试网7P6HX-zzP
ALf`/ga }Y0 当前session设定:51Testing软件测试网x,`i-K(V2xrS9DQf
SQL> alter session set events '10046 trace name context forever, level 8';
3@[9pG|0 SQL> select * from dual;51Testing软件测试网 U4Bm[_VU'p~
SQL> alter session set events '10046 trace name context off';
[8^*M0kn_,_0
-~{ @Wpw)o/^+k0 对其他用户进行设置:51Testing软件测试网"Op:]5h _k'A
SQL> select sid,serial#,username from v$session where username='XXX';
uCoa"Bb n0 SID SERIAL# USERNAME51Testing软件测试网%GRe]Xi
------ ---------- ------------------
(n9H,D"_!af/q)pF0 127 31923 A
_kV%kb9c0 128 54521 B
;mpX;CM8Qi0 129 48940 B 51Testing软件测试网Hzp SRI
SQL> exec dbms_system.set_ev(127,31923,10046,8,'A');
a\"[#E-y0X9\0 SQL> select * from dual;51Testing软件测试网X L/Ysi\Ml
SQL> exec dbms_system.set_ev(127,31923,10046,0,'A'); 51Testing软件测试网 r#}Ml@1D@^9s\9S
I+`2m;x B+R0 5、使用tkprof格式化跟踪文件:
+W_'i1G9f T|:J w0 51Testing软件测试网,X/bQ,JM"u
使用一下SQL找到当前session的跟踪文件:
h_S?9~"L0
AF'VG s}9P$qLR v_0 ---- 当前 session
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name51Testing软件测试网@CgT/J[s.n
51Testing软件测试网7F|.?8q4r-nfrom
jSLK!q/`1@ASZ051Testing软件测试网i)a+s4Hg( select p.spid from v$mystat m,v$session s, v$process p
'fx:k@:uA3U7u F051Testing软件测试网&HH~ bz7}.`6\/Fwhere m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,51Testing软件测试网U'm8U!mw NH2u'M
\I/]5t({ Wx$q`6M0 ( select t.instance from v$thread t,v$parameter v
%nt?2Acc051Testing软件测试网8S^QE]\$Ewhere v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
L8koGC051Testing软件测试网 wG8Fs|( select value from v$parameter where name = 'user_dump_dest' ) d;51Testing软件测试网a~B2S;f/F4iy_*g;d
'l$Ta P3ZaU*[m0 ---- 其他用户 session
7g9wY3]4pR I9HHL0y [+bN3T2b0 SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name
A&_-O([xC9^K0O+h6Xr3}f/ik*v0 from51Testing软件测试网^pe Z,f"vv
51Testing软件测试网_GhM9LylH9Nk,WI( select p.spid from v$session s, v$process p
0L8Ot'J[ vZ tz0f3n/Zi]0 where s.sid= '127' and s. SERIAL#= '31923' and p.addr = s.paddr) p,
1}*\E'T'H051Testing软件测试网T A!E(uu3| J;tD-el3P( select t.instance from v$thread t,v$parameter v
/f\$Wt4t6H#Df's051Testing软件测试网?dK:oB-z T0gOwhere v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,51Testing软件测试网"S+DVDH'~
/`^zM I@I0 ( select value from v$parameter where name = 'user_dump_dest' ) d;51Testing软件测试网"O.I%^$sE5I-b,H-oK
51Testing软件测试网+\8e1Bd6qn 查找后使用tkprof命令:51Testing软件测试网1h
H|Y6MS
SQL> $tkprof D:\......\SID_ora_5352.trc D:\......\SID_ora_5352.txt
5Q3`Zf!n1t9l*VYu0
"n#}i6R x(MsZ0注:无法使用autotrace的解决办法(9i):51Testing软件测试网:j!}yphU
SQL>start $ORACLE_HOME/rdbms/admin/utlxplan.sql;
P3?)n#u-@8{ s0SQL>create public synonym plan_table for plan_table;
Utq!J$g04q? [ R8zq0SQL>grant ALL on plan_table to public;
+NfZS,x$d'Na0/]$I;cb;EJF0-The End-
V#U
e%G.tz"u_k0
/X'n%|2@w"m/XuU0 =====================================================================51Testing软件测试网Q%|o"s@5{q_2Mf
a z@9GZ
O8aj0附:ORACLE诊断事件 51Testing软件测试网%x;xTv4g.m
51Testing软件测试网6o%n7Bl7|3I:Oy
Oracle为RDBMS提供了多种的诊断工具,诊断事件(Event)是其中一种常用、好用的方法,它使DBA可以方便的转储数据库各种结构及跟踪特定事件的发生.
(nQ1G~4{dLi0一、Event的通常格式及分类
8gfN(\n({+cs01、 通常格式如下:
nt!K+xxp0EVENT="<事件名称><动作><跟踪项目><范围限定>"51Testing软件测试网1~"Iio;@+SjJ4Kp
8o*qM'I6O!x%k3mI-@Bd_02、 Event分类51Testing软件测试网*w0B;E!X,O|4f
诊断事件大体上可以分为四类:
.L0UC? ET*]0a. 转储类事件:它们主要用于转储Oracle的一些结构,例如转储一下控制文件、数据文件头等内容。
0JVY-iIF9p+S3Nb0b. 捕捉类事件:它们用于捕捉一些Error事件的发生,例如捕捉一下ORA-04031发生时一些Rdbms信息,以判断是Bug还是其它原因引起的这方面的问题。
v_8p5C2mg0c. 改变执行途径类事件:它们用于改主一些Oracle内部代码的执行途径,例如设置10269将会使Smon进程不去合并那些Free的空间。51Testing软件测试网;L-_$t+H~'B.Bo
d. 跟踪类事件:这们用于获取一些跟踪信息以用于Sql调优等方面,最典型的便是10046了,将会对Sql进行跟踪。
\%?[6yJ&M#c_t03、 说明:51Testing软件测试网0u?AX.|
ON!i
a. 如果immediate放在第一个说明是无条件事件,即命令发出即转储到跟踪文件。
(X,~;BKQg0b. trace name位于第二、三项,除它们外的其它限定词是供Oracle内部开发组用的。
w
O e6w1TA(t0c. level通常位于1-10之间(10046有时用到12),10意味着转储事件所有的信息。例如当转储控制文件时,level1表示转储控制文件头,而level 10表明转储控制文件全部内容。
'^'N{U9C0d. 转储所生成的trace文件在user_dump_dest初始化参数指定的位置。
j h!Y2K"Z \&g0二、说一说设置的问题了51Testing软件测试网` [!\3tk$p
可以在init.ora中设置所需的事件,这将对所有会话期打开的会话进行跟踪,也可以用alter session set event 等方法设置事件跟踪,这将打开正在进行会话的事件跟踪。51Testing软件测试网jq0bX1Ot
Dy$DLC$aZ01、 在init.ora中设置跟踪事件的方法51Testing软件测试网P6R h(~#ef
a. 语法51Testing软件测试网cyBgpC
EVENT=”event 语法|,level n|:event 语法|,level n|…”
-t-CN
N9U7c,rz[&b0b. 举例
O3zV$e/_@hk0event=”10231 trace name context forever,level 10’
M&w]A cp0c. 可以这样设置多个事件:
a{S$Gu0EVENT="\51Testing软件测试网n~4x1ed,{2k
10231 trace name context forever, level 10:\
9R'D\!t~vS1V010232 trace name context forever, level 10"
2、 通过Alter session/system set events这种方法
-_#Awh3Z0M
Sb;l0举个例子大家就明白了
+E C@)XV0Example:
5~7}&]|sp1|h et0 Alter session set events ‘immediate trace name controlf level 10’;
4Qn7o3C#W0r9vQQ0 Alter session set events ‘immediate trace name blockdump level 112511416’; (*)
Px&w5xl$K1v:}
dF0在oracle8x及之上的版本也有这样的语句:
,T O6y+rc0 Alter system dump datafile 13 block 15;实现的功能与(*)是类似的。
s5{]]+FAdAig03、 使用DBMS_SYSTEM.SET_EV的方法