ITPub博客

首页 > 数据库 > Oracle > 收集统计信息

收集统计信息

原创 Oracle 作者:oracle_mao 时间:2015-12-24 14:49:15 0 删除 编辑

为何收集统计信息:
在OLAP系统中,一般不需要收集统计信息,主要用hint固定执行计划。因为一般OLAP系统,数据量都是很大的,数据基本都是批量导入的,而且数据总是在变化,所以如果收集统计信息的话,也是没啥用的。
在OLTP系统中,由于频繁的DML操作,导致数据总是在变化的,所以我们必须告诉oracle我们表里的数据的分布情况,所以就需要收集统计信息来让oracle知道我们这些表的数据分布情况。


BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SYS',
                                tabname          => 'TEST',
                                estimate_percent => 30,
                                method_opt       => 'for all columns size auto',
                                no_invalidate    => FALSE,
                                degree           => 1,
                                cascade          => TRUE);
END;
/
estimate_percent采样率:
采样率设置过高的话,会导致收集时间过长。采样率过低的话,会导致收集的不准确。
原厂建议是30的采样率比较标准。

method_opt:
有两部分构成,前面是类似for all columns是指对什么来收集。size是直方图的收集。size后跟的数值:
auto:Oracle determines the columns to collect histograms based on data distribution and the workload of the columns.它基于数据的分布以及应用程序访问列的方式来创建直方图。生产环境不要用auto来收集。
repeat:只会为现有的直方图重新分析索引,不再生成新的直方图。常用。
1-254桶数:size后面如果跟着10,那就代表用10个桶
skewonly:Oracle determines the columns to collect histograms based on the data distribution of the columns。只会根据column的数据分布情况决定是否收集histogram。
这里auto和skewonly类似,但区别是skewonly一定会收集这个列的直方图,但auto是会根据列的数据和workload。

degree并行度:
如果有4个cpu的话,那并行度最好设置为4,因为这里oracle可能会开8个进程,其中一个进程作为主进程,协调其他7个进程,这8个进程呢,可能有4个用来读取数据,另外4个用来做cpu运算。

no_invalidate:
收集统计信息后,在共享池中引用相关表的游标会不会立即失效。
如果统计信息过期了,收集统计信息后,执行计划没有变,那就no_invalidate设置为false。让之前的失效。

 cascade:
是否对索引也同时收集统计信息,索引收集统计信息的时候也是单块读,所以如果索引很大的话,这个会消耗很多时间。


 




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24500180/viewspace-1958331/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 直方图
请登录后发表评论 登录
全部评论

注册时间:2011-03-28

  • 博文量
    94
  • 访问量
    753031