直方图(Histogram)对CBO的影响

对于有列数据非常倾斜的表,做直方图分析很重要,直方图主要讨论的是数据在列上的分布情况。

可以看出,dbms_stats包默认已对所有的列做了直方图分析。CBO根据直方图信息估算id=99的记录只有1行,这很正确,所以选择索引。

CBO根据直方图信息估算id=1的记录有72483行,几乎和表记录数一致,所以选择了全表扫描。

在这里,仅仅删除直方图的信息,保留表和索引的分析信息

删除直方图后的执行计划

不管谓词id=99还是id=1,CBO估算行数均为725行,而实际id=99的记录只有1条,id=1的记录基本为全部的表记录,所以CBO均使用索引是错的。

在起初,我对T进行分析时,遗漏了estimate_percent=>100这一参数的设置,以至于不管是对谓词id=1还是id=99执行计划均采用全表扫描。我想是因为对id列上的数据分布情况没有分析出来(或者产生了分析信息是错误的),所以应该根据我们的数据量来设置estimate_percent值。

oracle 11gr2 document中对于estimate_percent的解释:

estimate_percent

Percentage of rows to estimate (NULL means compute): The valid range is [0.000001,100]. Use the constant DBMS_STATS.AUTO_SAMPLE_SIZE to have Oracle determine the appropriate sample size for good statistics. This is the default.The default value can be changed using the SET_DATABASE_PREFS Procedure, SET_GLOBAL_PREFS Procedure, SET_SCHEMA_PREFS Procedure and SET_TABLE_PREFS Procedure.

你可能感兴趣的:(CBO)