参考:https://blogs.oracle.com/optimizer/entry/how_does_the_method_opt
http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_stats.htm#i1036461
DBMS_STATS这个包在做分析时经常会用到,包里有个参数叫method_opt,说道说道
1.从语法上看基本有两种格式
?FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause] //从所有列,到进行一些限制
?FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...]
size_clause is defined as size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY} //REPEAT是继承之前的bucket数量,SKEW是倾斜的意思
默认格式是 FOR ALL COLUMNS SIZE AUTO.
2.从作用上看,主要有三方面
a).控制对哪些列做/不做统计
b).控制基于哪些列创建直方图
c).扩展统计(说白了,就是对几个列之前组合进行统计分析)
把前两个功能综合一下,主要有四种可能
a).做统计/做直方图
b).做统计/不做直方图
c).不做统计/做直方图
d).不做统计/不做直方图
后边两个既然都不做统计了,我们也就没有讨论的必要了
来看前两个,前面讲过,无论是统计还是做直方图,都是基于列的,这就牵扯到对列的选取上,是所有列,还是特定的某个列
for aaa columns size n1 for columns size n2 [bbb,ccc]
第一部分描述大部分列怎么样,第二部分则描述特定列怎么样
如果说所有列都做统计,但只有列ID做直方图,那么语法是
for all columns size 1 for columns size 254 id
其中size为1表示不做直方图
扩展统计感觉有点像补充日志(supplemental log data)可以对列与列之间的关系做统计和分析
举例:如果想对列FLAG1和FLAG2之间做组合分析,可以写成这样
dbms_stats.gather_table_stats('SH', 'SALES',method_opt => 'FOR ALL COLUMNS SIZE 254 FOR COLUMNS SIZE 254 (FLAG1, FLAG2)');
这样做以后,在查询视力user_tab_col_statistics时会发现,oracle给你组合起来的列起了个新名字
A>select column_name,num_distinct,histogram from user_tab_col_statistics where table_name='T';
COLUMN_NAME NUM_DISTINCT HISTOGRAM
------------------------------ ------------ ---------------
FLAG1 2 FREQUENCY
FLAG2 2 FREQUENCY
SYS_STUGVNB7PTIYWAVPJX#YT77WGD 2 FREQUENCY
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29646619/viewspace-1163282/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29646619/viewspace-1163282/