dbms_stats和analyze的选择(一)
上一篇 / 下一篇 2006-09-18 00:00:00 / 个人分类:performance tuning
)z L0}$?T#jJ$i_H0
-Ik_o:FdJ:O0dbms_stats和analyze的选择(一)
dbms_stats在很久以前ORACLE就推出了,ITPUB个人空间&q]xEr^D$Q2M@
那么就意味着我们不使用analyze来分析吗?
Y%M{o#vU,[V/sS0其实.analyze还是有着它存在的理由.ITPUB个人空间fXS+K5cCQ
我们的客户常常会问:我到底使用哪一个分析我的表呢?ITPUB个人空间X
B!Z"p"wd;a h
很多人使用analyze命令的方式仅限于compute和estimate以及生成一些直方图.然后把生成的命令置于job以.以便定期作表分析.ITPUB个人空间(E)lu'tPs'd
对于选择这两者之一将很大程度上影响你收集的准确性以及效果.
这里我们选择oracle 9i为例
ITPUB个人空间3N(LZ2u*rW
我们首先来看一下dbms_stats这包.这个包下面一共有40多个存储过程.通常使用的比较多的主要是DBMS_STATS.GATHER_TABLE_STATS 和 DBMS_STATS.GATHER_INDEX_STATS,
9O7Jz%VE:gv:j(pu0来看一下这两个过程的参数:
ITPUB个人空间HNTk,~'N
PROCEDURE GATHER_TABLE_STATSITPUB个人空间T0L,ni TtF
}#U
参数名称 类型 输入/输出默认值?ITPUB个人空间 N8W.i1FDoR j9d
------------------------------ ----------------------- ------ --------
~9v col.],`x|0OWNNAME VARCHAR2 IN
%rXP}Zh+W0TABNAME VARCHAR2 IN
0Q}1C"zP0PARTNAME VARCHAR2 IN DEFAULT
,J_z'S"R\Jl0ESTIMATE_PERCENT NUMBER IN DEFAULTITPUB个人空间A!W.r)bS4b\exP
BLOCK_SAMPLE BOOLEAN IN DEFAULT
+@1B-]VXse;C6P9K0METHOD_OPT VARCHAR2 IN DEFAULTITPUB个人空间-PM-W4{8Z5g3R
f
DEGREE NUMBER IN DEFAULTITPUB个人空间 Od](i+e1Dw
GRANULARITY VARCHAR2 IN DEFAULT
Yx R4fGL0j1J+lu0CASCADE BOOLEAN IN DEFAULTITPUB个人空间_[j1{3D)cB
STATTAB VARCHAR2 IN DEFAULTITPUB个人空间"T,hw(}8U*l
STATID VARCHAR2 IN DEFAULT
HmiQR ia?#hR0STATOWN VARCHAR2 IN DEFAULTITPUB个人空间qU [^/M8Db-m-Q
NO_INVALIDATE BOOLEAN IN DEFAULT
K TE.\e8YE"z:Z6r0PROCEDURE GATHER_INDEX_STATS
Eg\)XLA__4fL)_G0参数名称 类型 输入/输出默认值ITPUB个人空间x.yi2p]/r
------------------------------ ----------------------- ------ --------
"hRH hc(x%]W hf0OWNNAME VARCHAR2 IN
`3EY3T/U{a0INDNAME VARCHAR2 INITPUB个人空间 FI.a7vr)LP
PARTNAME VARCHAR2 IN DEFAULTITPUB个人空间C}4sd
{uM
ESTIMATE_PERCENT NUMBER IN DEFAULT
nGY3n {aH5k7N0STATTAB VARCHAR2 IN DEFAULTITPUB个人空间#cUz#F3S!e
STATID VARCHAR2 IN DEFAULT
"lLa:E@.S0STATOWN VARCHAR2 IN DEFAULT
FyJ'E.R)I0DEGREE NUMBER IN DEFAULT
sK'mE'et
bp0GRANULARITY VARCHAR2 IN DEFAULTITPUB个人空间~1c4W h$m-Bs0f k
NO_INVALIDATE BOOLEAN IN DEFAULT
0w3QU9r(q9kIc0estimate_percent:这个参数相当于analyze中的"estimate statistics sample x percent".为总行数的百分比来估算.如果该参数为空.则为compute
@2Z_%o:w0当然也可以使用DBMS_STATS.AUTO_SAMPLE_SIZE 让oracle 来决定估算百分比数
$p9S(KL8C5w-l0block_sample:该参数是一个boolean.在决定是否进行随机采样.
method_opt :该参数表明数据颁布不均衡的情况下是否使用直方图.可选值为"for all columns 或者for all indexed columns.ITPUB个人空间C0~2z:{M X
f}
当然也可以使用auto.让oracle来决定收集
cascade :决定是否收集相关表的索引的统计信息.
我们来看看不同的值下产生的性能:
b5U lfky0首先来看表结构:
SQL> desc test;
&q r9]#@*M d0Name Type Nullable Default Comments ITPUB个人空间+D.{0M%Gt$r
---- ------------ -------- ------- -------- ITPUB个人空间 fm%oV
n"h
ID NUMBER
-N{e!e\4e;{{n0NAME VARCHAR2(20) Y ITPUB个人空间2|-u(c~ \
SEX VARCHAR2(2) Y
SQL>
其中这张表有20480001条数据. 78208个块, 611MB大小.ITPUB个人空间7['a pe\u
索引创建情况:ITPUB个人空间qHq6ap}@
SQL> /
INDEX_NAME UNIQUENES DISTINCT_KEYS SAMPLE_SIZEITPUB个人空间bu#MxP
w$\
------------------------------ --------- ------------- -----------
e@;G6plI"J|tYe0B_IDX NONUNIQUE <---bitmap(sex列)ITPUB个人空间-k/e O7K(['Y/B
II UNIQUE 5120000 5120000 <---btree(id 列)
我们使用analyze的estimate 来分析表
&Y1LX6O$^
PV0SQL> analyze table test estimate statistics;
表已分析。
已用时间: 00: 00: 01.00
然后执行下面这个查询:ITPUB个人空间 pF2F&I[+Ls;hf
SQL> select * from test where id=1111111111111111;
未选定行
已用时间: 00: 00: 00.01
Execution PlanITPUB个人空间\jyl;L6dQ
----------------------------------------------------------
[.b-N3DM00 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=9)
)~s)m+~pE:['J~01 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=3 Card=1 Bytes=9)ITPUB个人空间jpG@'I7I c
2 1 INDEX (UNIQUE SCAN) OF 'II' (UNIQUE) (Cost=2 Card=5120000)
Statistics
6Prb#\5]C5_x6NW0----------------------------------------------------------ITPUB个人空间9\2E:p&C x$n
N"|(^$dj
0 recursive callsITPUB个人空间.S'Q"n$lW*~$e$s)U
0 db block gets
Es|8C5cV03 consistent getsITPUB个人空间8e4T#jN,k}A
u
3 physical reads
V&~TovL00 redo size