Hybrid histogram中
如果 popular value是倒数第二最大值,则不会被统计出来
SQL> @show_histogram_12c
Enter value for name: ID
HISTOGRAM EPV(EndPointValue) EP_ROWS EP% Density%
--------------- -------------------------------- ------------ ------- --------
HYBRID 1 1 .83 .9901
HYBRID 31 1 .83 .9901
HYBRID 61 1 .83 .9901
HYBRID 90 1 .83 .9901
HYBRID 100 1 .83 .9901
-------
sum 4.17
没有popular的值,但是ep的值总共才4.17%
SQL> set autot on expl
SQL> select count(*) from t where id=99.5;
COUNT(*)
----------
20
Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 4 | | |
|* 2 | TABLE ACCESS FULL| T | 1 | 4 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ID"=99.5)
执行计划认为只有1行,实际是20行(总共120行)
我设置了不同的buckets数目,都有这个问题,估计是是Hybrid histogram分bucket算法的问题,总会导致最后2个ndv被分到同一组。
研究了一下Hybrid Histogram的可能分组算法:
1 最小值放bucket 1
2 统计出popular( repeat_count > 1/n )值的个数和总数
3 对于非popular的值计算每个bucket放多少行,公式大概是
(非空总行数 - pop总行数)/(buckets -1 - pop_count)
5 遇到popular的值,全装入(一般会是最后一个)
6 四舍五入产生的误差并入最后一个bucket
估计问题就出在最后一步,因为每个bucket中只能看见最大的一个,无论它出现了多少次
阅读(1855) | 评论(0) | 转发(0) |