ITPub博客

首页 > 数据库 > Oracle > cbo心得(选择率,基数,直方图)(五)

cbo心得(选择率,基数,直方图)(五)

原创 Oracle 作者:sunwgneuqsoft 时间:2008-03-05 11:17:47 0 删除 编辑

延伸

1, 直方图的分类

直方图可以分为两类:FREQUENCY(频率)和HEIGHT BALANCED(高度平衡)

在弄明白这两类直方图,首先得知道什么直方图。用上面的例子来说明下:

[@more@]

SQL> select ENDPOINT_NUMBER,

2 ENDPOINT_VALUE

3 from user_tab_histograms

4 where table_name ='SUNWG'

5 and column_name = 'ID'

6 order by ENDPOINT_NUMBER;

ENDPOINT_NUMBER ENDPOINT_VALUE

--------------- --------------

6 1

7 201

8 801

9 1401

10 2001

上面就是列ID上的直方图信息,左边一列是截止点的编号,右边一列是截止点值。这个结果看起来有些奇怪,因为缺少了12345,实际上由于这几个值的ENDPOINT_VALUE都是1,所以ORACLE为了方便就把他们都省略了。对直方图信息补全后应该如下:

ENDPOINT_NUMBER ENDPOINT_VALUE

--------------- --------------

0 1

1 1

2 1

3 1

4 1

5 1

6 1

7 201

8 801

9 1401

10 2001

不知道大家还记得不,在user_tab_columns里面有一个列叫做NUMBER_BUCTETS,这个代表直方图的篮子个数。这么讲吧,在表SUNWG中一共有6000条记录,我把这6000条记录按照ID的大小进行排序,排序后的结果大概是111…199920002001,一共有6000条。在前面我做直方图统计的时候设置的BUCTET的个数是10,就等于把这6000条记录按照ID的顺序分成十份,放到十个篮子中。那么第一个篮子的开始值就应该是ENDPOINT_NUMBER = 0所代表的ENDPOINT_VALUE,也就是1,第一个篮子的截止值就应该是ENDPOINT_NUMBER = 1所代表的ENDPOINT_VALUE,也是1。依次类推,可以得到下面的结果

1…1|…1|…1|…1|…1|…1|…201|…801|…1401|…2001|

每个篮子中的记录数是6000/10 = 600

所以我们最后得到的直方图信息的准确性就由两个数值决定,一个是BUCTET的个数,一个NUM_DISTINCT的个数。

BUCTET < NUM_DISTINCT得到的是HEIGHT BALANCED(高度平衡)直方图,而当BUCTET = NUM_DISTINCT的时候得到的是FREQUENCY(频率)直方图。这里面BUCTET的最大值是254,所以我们一般见到的直方图都是HEIGHT BALANCED(高度平衡)直方图。

举个小例子来说明下两者的区别

假设一个的列的值有这几个:1134。这个时候NUM_DISTINCT = 3

当我们设置BUCTET = 2收集直方图信息的时候应该会得到下面的结果

ENDPOINT_NUMBER ENDPOINT_VALUE

--------------- --------------

0 1

1 1

2 4

而当我们设置BUCTET = 3收集直方图信息的时候应该会得到下面的结果

ENDPOINT_NUMBER ENDPOINT_VALUE

--------------- --------------

0 1

1 1

2 1

3 3

4 4

应该可以看出来两着的差别吧。一般说来,BUCTET越多,那么关于列的分布情况信息就越准确,可是在统计直方图的时候会消耗更多的资源。

当我们设置BUCTET = 1的时候,就等于是删除了直方图信息。

Analyze table sunwg compute statistics for table for columns id size 1;

1, non-popular value popular value

CBO在计算基数的时候,对于non-popular value popular value的处理不完全不同的。首先我们需要明白non-popular value popular value的区别。拿前面的例子来说,

ENDPOINT_NUMBER ENDPOINT_VALUE

--------------- --------------

0 1

1 1

2 1

3 1

4 1

5 1

6 1

7 201

8 801

9 1401

10 2001

popular value顾名思义,就是很流行的值,在这就是出现次数比较多的值,上面的例子中ID = 1 就是一个popular value,因为1ENDPOINT_VALUE出现了多次。那么什么是non-popular value呢,除了popular value以外的值都是non-popular value

对于HEIGHT BALANCED的直方图来说,non-popular value popular value的划分仅仅是一个近似的结果。有可能本来20popular value,但是由于BUCKET的原因,被CBO当成了non-popular value;反过来也是一样的。

对于FREQUENCY(频率)的直方图来说就不存在这样的问题,因为FREQUENCY(频率)直方图的信息是完全的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-1000434/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    56
  • 访问量
    758661