直方圖在列數(shù)據(jù)分布不均勻時非常有用,查詢優(yōu)化器需要直方圖信息才能做出正確的估算。有頻度直方圖與等高直方圖兩種。本篇依然使
直方圖在列數(shù)據(jù)分布不均勻時非常有用,查詢優(yōu)化器需要直方圖信息才能做出正確的估算。有頻度直方圖與等高直方圖兩種。本篇依然使用上一篇的測試表,文章鏈接Oracle中收集表與列統(tǒng)計(jì)信息
一、頻度直方圖
頻度直方圖使用的不是頻度,,而是使用累積頻度。下面的endpoint_number是取值的累計(jì)次數(shù)。
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
頻度直方圖的本質(zhì)特征有:
①桶數(shù)(分類數(shù))等于唯一值總數(shù)。
②列endpoint_value提供該本身。
③列endpoint_number是取值的累計(jì)出現(xiàn)次數(shù)。只有當(dāng)前endpoint_number減去上一endpoint_number才是當(dāng)前值的出現(xiàn)次數(shù)。
下面演示查詢優(yōu)化器怎樣使用頻度直方圖精確地估算出基于列val2過濾后查詢返回的基數(shù)(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
當(dāng)列的唯一值的個數(shù)大于桶允許的最大數(shù)量(254)時,就不能使用頻度直方圖了,此時應(yīng)該使用等高直方圖。
更多詳情見請繼續(xù)閱讀下一頁的精彩內(nèi)容:
相關(guān)閱讀:
32個字節(jié)限制——Oracle直方圖優(yōu)化
[Oracle新手教程] 用PL/SQL畫直方圖
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com