dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。
ITPUB个人空间(\_x'pI&y_j___m
d_X_x
exec dbms_stats.gather_schema_stats(ITPUB个人空间_u"M2E,@ n_G_t(E+c
ownname => 'SCOTT',ITPUB个人空间_m"r_j
z5[&K_U_~0Z(r4\_t
options => 'GATHER AUTO',华罗庚简介ITPUB个人空间_x_R5]+`4Y6_ P)Z_D
estimate_percent => dbms_stats.auto_sample_size,
J&j_}_h_h+Q_z_k0method_opt => 'for all columns size repeat',ITPUB个人空间,}_^3m_c3c5T ^'G
degree => 15ITPUB个人空间,Z_o%S_W:y
)
为了充分认识dbms_stats的好处,需要仔细体会每一条主要的预编译指令(directive)。下
面让我们研究每一条指令,并体会如何用它为基于代价的SQL优化器收集最高质量的统计数据。
_O_n_c)]_Q_P7m_I_e0options参数使用4个预设的方法之一,这个选项能控制Oracle统计的刷新方式:
gather——重新分析整个架构(Schema)。
#a_G_Rt;Q1U0gather empty——只分析目前还没有统计的表。
&B_[:i/k,Z0gather stale——只重新分析修改量超过10%的表(这些修改包括插入、更新和删除)。ITPUB个人空间_d |_k_U_a_t.p_N_k
gather auto——重新分析当前没有统计的对象,以及统计数据过期(变脏)的对象。注意,使用gather auto类似于组合使用gather stale和gather empty。ITPUB个人空间4n_n_Y_T_q_}7D
注意,无论gather stale还是gather auto,都要求进行监视。如果你执行一个alter table xxx monitoring命令,Oracle会用dba_tab_modifications视图来跟踪发生变动的表。这样一来,你就确切地知道,自从上一次 分析统计数据以来,发生了多少次插入、更新和删除操作。
estimate_percent选项
estimate_percent参数是一种比较新的设计,它允许Oracle的dbms_stats在收集统计数据
时,自动估计要采样的一个gment的最佳百分比:
(J(y_V_o;j:S0estimate_percent => dbms_stats.auto_sample_size
要验证自动统计采样的准确性,你可检视dba_tables sample_size列。一个有趣的地方是,在使用自动采样时,Oracle会为一个样本尺寸选择5到20的百分比。记住,统计数据质量越好,CBO做出的决定越好。
method_opt选项
#m
路基强夯p+n-` U0method_opt:for table --只统计表
_o/|_I/f�T_L#q0F2i*O0 for all indexed columns --只统计有索引的表列ITPUB个人空间4S_l7E_w2T_H
v
for all indexes --只分析统计相关索引ITPUB个人空间IC2W:N_Y_pa
m
for all columns
dbms_stats的method_opt参数尤其适合在表和索引数据发生变化时刷新统计数据。metho
d_opt参数也适合用于判断哪些列需要直方图(histograms)。
某些情况下,索引内的各个值的分布会影响CBO是使用一个索引还是执行一次全表扫描的决策。例如,假如在where子句中指定的值的数量不对称,全表扫描就显得比索引访问更经济。
如果你有一个高度倾斜的索引(某些值的行数不对称),就可创建Oracle直方图统计。但在现实世界中,出现这种情况的机率相当小。使用CBO时,最常见 的错误之一就是在CBO统计中不必要地引入直方图。根据经验,只有在列值要求必须修改执行计划时,才应使用直方图。
为了智能地生成直方图,Oracle为dbms_stats准备了method_opt参数。在method_opt子句中,还有一些重要的新选项,包括skewonly,repeat和auto:ITPUB个人空间,L_u
F/w*F
method_opt=>'for all columns size skewonly'ITPUB个人空间.m_x3r
K_m�^+`
method_opt=>'for all columns size repeat'ITPUB个人空间)}$v7w O+l
method_opt=>'for all columns size auto'
skewonly选项会耗费大量处理时间,因为它要检查每个索引中的每个列的值的分布情况。
假如dbms_stat发现一个索引的各个列分布得不均匀,就会为那个索引创建直方图,帮助基于代价的SQL优化器决定是进行索引访问,还是进行全表扫描 访问。例如,在一个索引中,假定有一个列在50%的行中,如清单B所示,那么为了检索这些行,全表扫描的速度会快于索引扫描。
--*************************************************************
#|4V$|$@_y_B_M8m0-- SKEWONLY option—Detailed analysisITPUB个人空间7C_E;x&d q_r
--省的拼音怎么写
云纹铜禁;C2z_`"d_X9i_p0-- U this method for a first-time analysis for skewed indexesITPUB个人空间:__Y;TR*__V_u_v_J
银行利率计算-- This runs a long time becau all indexes are examinedITPUB个人空间%q_S_a%l k
--*************************************************************
_r!\ v:A)G_U0
_Us(C_p_[5M o4` T0
begin
_v_Y_G_g_A_|0 dbms_stats.gather_schema_stats(
_A"^8l m/J!r_l0 ownname => 'SCOTT',
.M_p"y.l8Z(^�C`?1@.Y0 estimate_percent => dbms_stats.auto_sample_size,ITPUB个人空间_S
W!t_X'O*\_@_g_ql_S
method_opt => 'for all columns size skewonly',
&Q_~_D.d0u_{_b_~.P)r0 degree => 7ITPUB个人空间 E |_o u&{
);
)d"R_?_F_^0Z_M1\0end;
重新分析统计数据时,使用repeat选项,重新分析任务所消耗的资源就会少一些。使用repeat选项(清单C)时,只会为现有的直方图重新分析索引,不再搜索其他直方图机会。定期重新分析统计数据时,你应该采取这种方式。
--**************************************************************
6y+D%|_].s_m8S E6j0-- REPEAT OPTION - Only reanalyze histograms for indexesITPUB个人空间
^�ob2b_J
-- that have histogramsITPUB个人空间-K_T_p_N!X_Y(E
--
_g U_G*Y!F英语社团活动计划
]_Q
T p0-- Following the initial analysis, the weekly analysisITPUB个人空间2u_I__/u___?_n_O
O
-- job will u the “repeat” option. The repeat option
L,B_B3X_N'h_v8n/N0-- tells dbms_stats that no indexes have changed, andITPUB个人空间7G_M_f&o;T_I9R8m2\
-- it will only reanalyze histograms for
_e_J9w:m_d3q_V_P0-- indexes that have histograms.
6h_G6{_l#Mv_b0--**************************************************************ITPUB个人空间"u污水处理厂实习报告�O)V;X/M_K_z_U
beginITPUB个人空间_V_l
L.Z6y�p+^,e
dbms_stats.gather_schema_stats(
开拓思路)I0P_m6B%E C)r_s0
ownname => 'SCOTT',ITPUB个人空间,u4[*P
m_kk+q
estimate_percent => dbms_stats.auto_sample_size,
_h
O+p_w__0u3\)B5d0 method_opt => 'for all columns size repeat',ITPUB个人空间_n g_b%k_f7X
degree => 7ITPUB个人空间(w_`
__D$@'?_N_`
);
_h*m_V_r:M/V_t0end;
使用alter table xxx monitoring;命令来实现Oracle表监视时,需要使用dbms_stats中的auto选项。如清单D所示,auto选项根据数据分布以及应 用程序访问列的方式(例如通过监视而确定的一个列的工作量)来创建直方图。使用method_opt=>’auto’类似于在dbms_stats 的option参数中使用gather auto。
beginITPUB个人空间_D-f_A(s4a(Z'V8Z1~
d
dbms_stats.gather_schema_stats(ITPUB个人空间_g_J }_l_]
ownname => 'SCOTT',ITPUB个人空间,g_V8k_t_n8Y_a8g
W
estimate_percent => dbms_stats.auto_sample_size,
_B
o_q_S_F6j k0 method_opt => 'for all columns size auto',ITPUB个人空间_B-T!l#G_s6z_F_V_g ~0L
degree => 7
0F1|_Q;f_v8X_U0 );
_[_X_O(J_A9\*m5g.W.} uW0end;
并行统计收集degree参数
C_?_u+x$jp c_}_x0Oracle推荐设置DBMS_STATS的DEGREE参数为DBMS_STATS.AUTO_DEGREE,该参数允许Oracle根据对象的大小和并行性初始化参数的设置选择恰当的并行度。ITPUB个人空间#R
[_g�m_ti
聚簇索引,域索引,位图连接索引不能并行收集。
如何使用dbms_stats分析统计信息?ITPUB个人空间3E
o']_M.]_i4\
--创建统计信息历史保留表
sql> exec ate_stat_table(ownname => 'scott',stattab => 'stat_table') ;