Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1285128
  • 博文数量: 127
  • 博客积分: 2286
  • 博客等级: 大尉
  • 技术积分: 1943
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-10 10:37
文章分类

全部博文(127)

文章存档

2018年(1)

2015年(2)

2014年(1)

2013年(30)

2012年(88)

2011年(5)

分类: Oracle

2013-12-17 23:07:34

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中只能看见最大的一个,无论它出现了多少次




阅读(1803) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~