直方圖在列數據分布不均勻時非常有用,查詢優化器需要直方圖信息才能做出正確的估算。有頻度直方圖與等高直方圖兩種。本篇依然使
直方圖在列數據分布不均勻時非常有用,查詢優化器需要直方圖信息才能做出正確的估算。有頻度直方圖與等高直方圖兩種。本篇依然使用上一篇的測試表,文章鏈接Oracle中收集表與列統計信息
一、頻度直方圖
頻度直方圖使用的不是頻度,,而是使用累積頻度。下面的endpoint_number是取值的累計次數。
SELECT ENDPOINT_VALUE,
ENDPOINT_NUMBER,
ENDPOINT_NUMBER - LAG(ENDPOINT_NUMBER, 1, 0) OVER(ORDER BY ENDPOINT_NUMBER) AS FREQUENCY
FROM USER_TAB_HISTOGRAMS
WHERE TABLE_NAME = 'T'
AND COLUMN_NAME = 'VAL2'
ORDER BY ENDPOINT_NUMBER;
ENDPOINT_VALUE
ENDPOINT_NUMBER
FREQUENCY
101
8
8
102
33
25
103
101
68
104
286
185
105
788
502
106
1000
212
頻度直方圖的本質特征有:
①桶數(分類數)等于唯一值總數。
②列endpoint_value提供該本身。
③列endpoint_number是取值的累計出現次數。只有當前endpoint_number減去上一endpoint_number才是當前值的出現次數。
下面演示查詢優化器怎樣使用頻度直方圖精確地估算出基于列val2過濾后查詢返回的基數(cardinality)。
EXPLAIN PLAN SET STATEMENT_ID '101' FOR SELECT * FROM t WHERE val2=101;
EXPLAIN PLAN SET STATEMENT_ID '102' FOR SELECT * FROM t WHERE val2=102;
EXPLAIN PLAN SET STATEMENT_ID '103' FOR SELECT * FROM t WHERE val2=103;
EXPLAIN PLAN SET STATEMENT_ID '104' FOR SELECT * FROM t WHERE val2=104;
EXPLAIN PLAN SET STATEMENT_ID '105' FOR SELECT * FROM t WHERE val2=105;
EXPLAIN PLAN SET STATEMENT_ID '106' FOR SELECT * FROM t WHERE val2=106;
SELECT STATEMENT_ID,CARDINALITY FROM plan_table WHERE ID=0;
STATEMENT_ID
CARDINALITY
101
8
102
25
103
68
104
185
105
502
106
212
當列的唯一值的個數大于桶允許的最大數量(254)時,就不能使用頻度直方圖了,此時應該使用等高直方圖。
更多詳情見請繼續閱讀下一頁的精彩內容:
相關閱讀:
32個字節限制——Oracle直方圖優化
[Oracle新手教程] 用PL/SQL畫直方圖
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com