直方图超出范围后,基数的表现:
先创建了一张表,skew列的值收集了等频直方图,列的值存在如下规律,1将出现1次,2将出现2次,3将出现3次. . . . .80将出现80次。

可以从上图中的结果看到,超出范围后,ORACLE都采用了数字1来作为基数。如果使用的是统计信息记录的查询变量也都得到了正确的基数。对于skew=:bind的情况,都采用了num_rows/num_distinct进行计算。经过验证,等频直方图的density=1/(2*num_rows)。可能这也是为什么当我们请求的区间越界后,得到的基数总是1的原因。等高直方图的density算法比较复杂,对于在最大值,最小值范围内的非高频值的绑定变量查询,ORACLE采用density来进行计算,而不是(1/num_distinct).

对于表上不存在直方图的列。进行范围查询的时候,对超出最小值,最大值记录范围内的查询值的计算:
示例里的测试表month_no一共1-12,12个整数值,每个值对应100条记录,一共1200条记录。超出查询范围后,ORACLE默认的采用month_nu=一个常量来进行计算。
对于表上不存在直方图的列。进行in list查询的时候,对超出最小值,最大值记录范围内的查询值的计算:

可以看到10.1.0.4后,ORACLE对于超出最小最大值范围内的查询值,得出的基数呈递减的趋势。

这对于某些从不更新统计信息的应用可能并不是一个好消息。可能到了某个时间,你的查询计划会出现剧烈的波动。
{4BCF02D5-610F-4696-89FB-83E23BD52440}.jpg
{B36BA92A-AE5B-4EEC-887C-E9930CFE17D3}.jpg
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22034023/viewspace-718046/ ,如需转载,请注明出处,否则将追究法律责任。