延伸
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上的直方图信息,左边一列是截止点的编号,右边一列是截止点值。这个结果看起来有些奇怪,因为缺少了1,2,3,4和5,实际上由于这几个值的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的大小进行排序,排序后的结果大概是1,1,1…1999,2000,2001,一共有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(高度平衡)直方图。
举个小例子来说明下两者的区别
假设一个的列的值有这几个:1,1,3,4。这个时候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,因为1在ENDPOINT_VALUE出现了多次。那么什么是non-popular value呢,除了popular value以外的值都是non-popular value。
对于HEIGHT BALANCED的直方图来说,non-popular value 和 popular value的划分仅仅是一个近似的结果。有可能本来20是popular value,但是由于BUCKET的原因,被CBO当成了non-popular value;反过来也是一样的。
对于FREQUENCY(频率)的直方图来说就不存在这样的问题,因为FREQUENCY(频率)直方图的信息是完全的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-1000434/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8394333/viewspace-1000434/