oracle 收集对象统计信息收集选项

在表8-2中列出的收集选项参数指定了收集统计信息的过程如何进行,收集哪些类型的列统计信息,以及是否使从属SQL游标失效。

Ø  estimate_percent指定收集统计信息时是否使用采样。有效值为0.000001到100之间的十进制数字。当值为100时,其含义与NULL一样,意味着不进行采样。常量dbms_stats.auto_sample_size,也就是默认值(这个默认值可以修改),会让存储过程来决定采样大小。从11.1版本开始,推荐使用这个值。实际上,在大多数情况下,使用这个默认值不仅使收集的统计信息比使用类似10%的采样率进行收集要更加精确,而且也更加快速。

Ø  这是因为在11.1版本中引入了一种全新的算法,而且这种算法只能在指定参数值为dbms_stats.auto_sample_size时才可以使用。同时也要指出,因为这个新的算法需要对收集统计信息的表执行全表扫描,这在磁盘I/O子系统相对缓慢的系统上可能会花费很长时间。还要注意,某些特性(高频率直方图、混合直方图,还有增量统计信息)要求指定dbms_stats.auto_sample_size。

Ø  有一点很重要,将一个十进制数字作为参数传递进来时,由参数estimate_percent指定的值只不过是用于收集统计信息的最小百分比。事实上,正如下例所示,如果dbms_stats包认为由estimate_percent指定的值过小,那么程序包可能会自动增大这个值。假如不使用dbms_stats.auto_sample_size进行收集,可以使用较小的百分比来加速对象统计信息的收集;一般来说小于10个百分点就比较合适。对于特大的表,0.5个百分点、0.1个百分点,或者更小的值也不会有问题。

Ø  实际上的最佳值取决于数据分布情况。如果不确定该选什么,干脆就尝试不同的估算百分比然后比较收集的统计信息。这样,你可能会在性能和精确度之间找到一个最佳折衷点。注意,使用小的估算百分比可能不会产生稳定的统计信息。因为如果收集统计信息是在数据库或模式级别上执行,则过小的值会被自动增大,估算的百分比应该按最大的那张表来选择。顺便提一下,在外部表上采样是不受支持的:

BEGIN

  dbms_stats.gather_schema_stats(ownname => user, estimate percent => 0.5);