https://blogs.oracle.com/optimizer/entry/how_does_the_method_opt
method_opt选项的作用
收集基本列信息
创建直方图
收集扩展统计信息
method_opt的组成
有多个部分,前2个必须指定,
第一部分: 收集基本信息(min,max,NDV,nulls数),默认为for all columns;如果某列没有被指定,则只记录其平均列长度;
第二部分: 创建直方图,默认为auto,可指定1--254的整数值,也可使用repeat/skewonly
For all [indexed|hidden] columns size [size_clause]
如何只对特定列收集直方图
使用for columns选项
假定只对sales表的method_opt收集直方图
dbms_stats.gather_table_stats('SH','SALES',method_opt =>'FOR ALL COLUMNS SIZE 1 FOR COLUMNS SIZE 354 CUST_ID')
如何跳过某列收集统计信息
oracle没有提供相应API,不过可以逆向思维,即显示指定其余列
假定不对sales表的prod_id收集统计信息
dbms_stats.delete_column_stats('SH','SALES','PROD_ID');
dbms_stats.gather_table_stats('SH','SALES','FOR COLUMNS SIZE 254 CUST_ID TIME_ID CHANNEL_ID');
SELECT column_name, num_distinct, histogram FROM user_tab_col_statistics WHERE table_name = 'SALES'
--该查询便不会显示prod_id列信息
注:for columns只适用于gather_table_stats,11g可通过set_table_prefs将上述定制行为设为默认选项
如何不对某列收集直方图
11g
可利用新功能set_table_prefs
删除该列直方图:dbms_stats.delete_column_stats( ownname=>'SH', tabname=>'SALES', colname=>'PROD_ID', col_stat_type=>'HISTOGRAM');
设置pref:dbms_stats.set_table_prefs('SH', 'SALES','METHOD_OPT', 'FOR ALL COLUMNS SIZE AUTO, FOR COLUMNS SIZE 1 PROD_ID');
10g
删除该表信息并将其锁定;
dbms_stats.delete_table_stats(ownname=>'SH', tabname=>'SALES');
dbms_stats.lock_table_stats(ownname=>'SH', tabname=>'SALES');
单独创建一个job对其收集信息;
BEGIN
dbms_stats.gather_table_stats('SH', 'SALES',method_opt=>'FOR ALL COLUMNS SIZE AUTO FOR COLUMNS SIZE 1 PROD_ID',force => true);
END;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-763677/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15480802/viewspace-763677/