ITPub博客

首页 > 数据库 > Oracle > method_opt

method_opt

原创 Oracle 作者:goasktom 时间:2014-05-17 15:12:41 0 删除 编辑

参考: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博客 ” ,链接:https://blog.itpub.net/29646619/viewspace-1163282/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 让oracle跑得更快
下一篇: /*+append*/
请登录后发表评论 登录
全部评论

注册时间:2014-05-07

  • 博文量
    27
  • 访问量
    43326