關於直方圖中關於字元型別的ENDPOINT_VALUE欄位的轉換

gaopengtttt發表於2014-12-30
  
今天看書(基於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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章