cbo心得(選擇率,基數,直方圖)(五)

jlttt發表於2008-08-10
cbo心得(選擇率,基數,直方圖)(五)
[@more@]

延伸

1, 直方圖的分類

直方圖可以分為兩類:FREQUENCY(頻率)和HEIGHT BALANCED(高度平衡)

在弄明白這兩類直方圖,首先得知道什麼直方圖。用上面的例子來說明下:


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/9533994/viewspace-1008781/,如需轉載,請註明出處,否則將追究法律責任。

相關文章