histogram一點研究(待整理)

foreverlee發表於2006-03-22

一 基於值的histogram

1
corp表sp_id列的distinct key為22
SQL> select count(distinct sp_id) from corp;

COUNT(DISTINCTSP_ID)
--------------------
22

[@more@]

一 基於值的histogram

1
corp表sp_id列的distinct key為22
SQL> select count(distinct sp_id) from corp;

COUNT(DISTINCTSP_ID)
--------------------
22

2 使用以下語句產生柱狀圖資料.預設會產生75個buckets來表示資料分佈

SQL> analyze table corp compute statistics for columns sp_id;

Table analyzed.

3 當histogram buckets>=表的distinct key時,那麼Oracle會使用基於值的histogram,每個值將會佔據一個bucket

SQL> select ENDPOINT_NUMBER,ENDPOINT_VALUE,ENDPOINT_ACTUAL_VALUE from user_histograms
2 where TABLE_NAME='CORP'
3 and COLUMN_NAME='SP_ID';


基於值的Histogram,
ENDPOINT_VALUE表示表CORP SP_ID列的值
ENDPOINT_NUMBER表示該值的分佈

ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_ACTUAL_VALUE
--------------- -------------- ------------------------------
242 6
369 9
384 11
413 13
431 14
447 15
489 16
500 17
513 18
514 19
518 20

ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_ACTUAL_VALUE
--------------- -------------- ------------------------------
523 21
532 22
535 23
537 24
546 25
549 26
556 27
559 28
563 29
566 30
586 31

22 rows selected.

這裡我們也可以透過以下查詢得到sp_id=6時的紀錄條數
SQL> select count(*) from corp where sp_id=6;

COUNT(*)
----------
242

369-242=127
SQL> select count(*) from corp where sp_id=9;

COUNT(*)
----------
127


二 基於高度的histogram

1
for columns sp_id size 10表示十個Buckets表示資料分佈

SQL> analyze table corp compute statistics for columns sp_id size 10;

Table analyzed.

SQL> SELECT column_name, num_distinct, num_buckets
2 FROM USER_TAB_COL_STATISTICS
3 WHERE table_name = 'CORP' and column_name ='SP_ID';

COLUMN_NAME NUM_DISTINCT NUM_BUCKETS
------------------------------ ------------ -----------
SP_ID 22 5


當histogram buckets的數量(10)少於列的distinct(22) value時,oracle會採用基於高度的直方圖反映資料分佈,每個bucket容納相同數量的值。


表corp共586條資料,第0-8個Buckets每個Bucket儲存58條紀錄,第9個儲存64條紀錄
SQL> select count(*) from corp;

COUNT(*)
----------
586

SQL> select 586/10 from dual;

586/10
----------
58.6

前4個(1,2,3,4)buckets儲存sp_id=6的紀錄
4*58=232
所以sp_id=6的紀錄大約在232左右
SQL> select ENDPOINT_NUMBER,ENDPOINT_VALUE,ENDPOINT_ACTUAL_VALUE from user_histograms
2 where TABLE_NAME='CORP'
3 and COLUMN_NAME='SP_ID';

ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_ACTUAL_VALUE
--------------- -------------- ------------------------------
4 6
6 9
7 13
8 16
9 22
10 31

6 rows selected.

實際查詢為242
SQL> select count(*) from corp where sp_id=6;

COUNT(*)
----------
242

6-4=2個(4,5)Buckets儲存sp_id=9的紀錄
2*58=116 實際127條紀錄
SQL> select count(*) from corp where sp_id=9;

COUNT(*)
----------
127

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/76065/viewspace-822222/,如需轉載,請註明出處,否則將追究法律責任。

相關文章