ORACLE性能优化笔记
上一篇 / 下一篇 2007-12-27 15:41:52 / 个人分类:调优
select * from v$sql_plan where hash_value = (select sql_hash_value from v$session where sid = 1111);ITPUB个人空间6`9Dy/o8^ rg1N!C*p
其中id和parent_id表示了执行数的结构,数值最大的为最先执行比如
ID PARENT_ID
9q Yo"V6X4T0-------------
{}*p$@4{
R.~00 ITPUB个人空间2QN/I$YbKv6zS
1 0
Q2Lb)Q^(k}t3r4qI02 1
'D"j9j"_;ZF\03 2ITPUB个人空间/qx/Z4k@qU#fN_#E
4 3
c7E8s!z%@#VSA4BF05 4
bb3g7C5c;r.b/M06 3
则执行计划树为ITPUB个人空间 AC,n0RZ
0ITPUB个人空间)a h1J?)_S9?'l
1
/Qd#M1z)Ro|0 2
V6U!d6H9c&P;[ aB&i0 3
A/Zm+Q8W;J Rr0 6 4
7X-{hkQ0 5
2.如何设置自动跟踪
!Yf}6b7z/K)K&Vvx0 用system登录ITPUB个人空间9O#f dR]$j2\
执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建计划表
0vb'H/^
`*P0 执行$ORACLE_HOME/sqlplus/admin/plustrce.sql创建plustrace角色
,x1l!R
n@)~0 如果想计划表让每个用户都能使用,则
`c6k1GR+F;H{0 SQL>create public synonym plan_table for plan_table;ITPUB个人空间+gE5~E)z z(a-bgav
SQL> grant all on plan_table to public;
如果想让自动跟踪的角色让每个用户都能使用,则ITPUB个人空间D)gi!BNj
SQL> grant plustrace to public;ITPUB个人空间 g.BOWK?7E-~
通过如下语句开启/停止跟踪
%x7N8?[/kJ%|
R0 SET AUTOTRACE ON |OFF | ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN
3.如何跟踪自己的会话或者是别人的会话ITPUB个人空间V7KSE k+F
跟踪自己的会话很简单
j{\1~1a/g-}%z;CkB0 Alter session set sql_trace true|false
Av:DQ#` u
E#n%Pl0 OrITPUB个人空间5{X5f%BJ8n,N;~
Exec dbms_session.set_sql_trace(TRUE);
如果跟踪别人的会话,需要调用一个包ITPUB个人空间)]Z%wE
K5n
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
跟踪的信息在user_dump_dest 目录下可以找到或通过如下脚本获得文件名称(适用于Win环境,如果是unix需要做一定修改)ITPUB个人空间i4oZ
h]$`ZEC#?!}
SELECT p1.value||'\'||p2.value||'_ora_'||p.spid||'.ora' filename
Lpw7W$u0 FROM
kP#C}P`0 v$process p,
+\r-WC:{(pu&Cm/X0 v$session s,ITPUB个人空间)P,\v{-K,q+W8u
v$parameter p1,ITPUB个人空间-p,fqL~+r8v
v$parameter p2ITPUB个人空间8EXAp0{au/B5k
WHERE p1.name = 'user_dump_dest'ITPUB个人空间KL*qi7g$\lC
AND p2.name = 'db_name'ITPUB个人空间:|#zLf
Xm#U
A(I
AND p.addr = s.paddr
_c0AJ,t-Q0 AND s.audsid = USERENV ('SESSIONID')ITPUB个人空间~E8x
p
Lnm
最后,可以通过Tkprof来解析跟踪文件,如
]P1G7lj @j @
[(q3Zs+@0 Tkprof 原文件 目标文件 sys=n
4.怎么设置整个数据库系统跟踪
gbL.TO-X0 其实文档上的alter system set sql_trace=true是不成功的,但是可以通过设置事件来完成这个工作,作用相等ITPUB个人空间!BN/INr
O"W
alter system set events
uo|a;eM6{y0 '10046 trace name context forever,level 1';
如果关闭跟踪,可以用如下语句
0M%O-Rc
dlZ0 alter system set eventsITPUB个人空间/KN*?aC|NEbDPz*k_
'10046 trace name context off';
其中的level 1与上面的8都是跟踪级别ITPUB个人空间kQBs+IY"W"j@r
level 1:跟踪SQL语句,等于sql_trace=true
P2y~
B$k0 level 4:包括变量的详细信息ITPUB个人空间t9@2X@Vv/N4uC L!zs
level 8:包括等待事件
z2g2lda/o0 level 12:包括绑定变量与等待事件
5.怎么样根据OS进程快速获得DB进程信息与正在执行的语句ITPUB个人空间|x9A j ]Fts_Q
有些时候,我们在OS上操作,象TOP之后我们得到的OS进程,怎么快速根据OS信息获得DB信息呢?
v/y!u]t0 我们可以编写如下脚本:ITPUB个人空间R"X7K1Rr"Y
$more whoit.shITPUB个人空间)l%S ~)mu)Q1t
#!/bin/sh
[ v#G(U8E\
jU0 sqlplus /nolog 100,cascade=> TRUE);
'yu.l-S\Wf0 dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
这是对命令与工具包的一些总结ITPUB个人空间"Y$k%WT.ZY?+K
<1>、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。ITPUB个人空间/IWH| ]u P
a) 可以并行进行,对多个用户,多个Table
I-z9C$JG`6E0 b) 可以得到整个分区表的数据和单个分区的数据。
K2P6ru:s;a.q
ie0 c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
&{7yASo/U)pH7]$p0 d) 可以倒出统计信息ITPUB个人空间BS&k{x(vC%~ b
e) 可以用户自动收集统计信息
.t/S)i@;ksWP0 <2>、DBMS_STATS的缺点
6z"G8pW-h\WtK)d0 a) 不能Validate Structure
3l8[
C i0oy0 b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。ITPUB个人空间5}dB RZ5N?&C4{
c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True
9}#B]~!h4g1O#j\0 <3>、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。
6.怎么样快速重整索引
7ztA)xgV0 通过rebuild语句,可以快速重整或移动索引到别的表空间ITPUB个人空间-Oeh%O&A
rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数
:Jlbe gg0 语法为
M4\j1Y@QM0 alter index index_name rebuild tablespace ts_nameITPUB个人空间(d/lZ%lN}#SY
storage(......);
如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改
uQ @z%G3|X0 SQL> set heading off
9Cz}Y,qb%\0 SQL> set feedback offITPUB个人空间mE x
m
@!Z
SQL> spool d:\index.sql
0]a i^_+u;~l-R0 SQL> SELECT 'alter index ' || index_name || ' rebuild '
!n&uB`7f0 ||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'ITPUB个人空间Zn)a5wXen:W%o4`
FROM all_indexes
YTv%n(vC0 WHERE ( tablespace_name != 'INDEXES'
d%Lfnv7E
s0 OR next_extent != ( 256 * 1024 )
\Gt3^G!M@0 )
7VB[9Z-S0 AND wner = USER
6~fJ!Gw+IYa8{0 SQL>spool off
另外一个合并索引的语句是