今天看书(基于ORACLE的SQL优化)看到关于直方图dba_histograms ENDPOINT_VALUE字段的计算问题所以记录如下:
1、数字类型的ENDPOINT_VALUE没有什么悬念就是其本生的值
2、字符类型的ENDPOINT_VALUE计算相对复杂,是取字符的头15的字节经过16进制DUMP后在转换为十进制进行的
测试如下(以频率直方图为列):
SQL> select count(*),d from testh group by d order by d;
COUNT(*) D
---------- --------------------
70 chenxiuying
10 gaopeng
90 gaozhuheng
30 gaozihan
60 yanlei
TABLE_NAME ENDPOINT_VALUE ENDPOINT_NUMBER
TESTH 5.16154795827062E35 70
TESTH 5.36782799271625E35 80
TESTH 5.36782802370135E35 170
TESTH 5.36782802371282E35 200
TESTH 6.30244062259123E35 260
如下我们来计算一下5.16154795827062E35,5.36782799271625E35,5.36782802370135E35,5.36782802371282E35,6.30244062259123E35是如何计算出来的
1、5.16154795827062E35
SQL> select dump('chenxiuying',16) from dual;
DUMP('CHENXIUYING',16)
-----------------------------------------------
Typ=96 Len=11: 63,68,65,6e,78,69,75,79,69,6e,67
SQL> select to_number('6368656e78697579696e6700000000','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') from dual;
TO_NUMBER('6368656E78697579696
------------------------------
5.16154795827062E35
可以看到5.16154795827062E35已经计算出来了。
2、5.36782799271625E35
SQL> select dump('gaopeng',16) from dual;
DUMP('GAOPENG',16)
----------------------------------
Typ=96 Len=7: 67,61,6f,70,65,6e,67
SQL> select to_number('67616f70656e670000000000000000','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') from dual;
TO_NUMBER('67616F70656E6700000
------------------------------
5.36782799271625E35
可以看到5.36782799271625E35已经计算出来了。
余下的使用相同的办法可以计算得出,当然其分布也是正常的,字段为chenxiuying为70行,字段为gaopeng为80-70为10行,可以看出没有问题。
但是一旦字符超过15个字节就会相同,就会出现分布异常的问题。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-1384702/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7728585/viewspace-1384702/