一、優化器的分類
Oracle7和Oracle8 都有兩種可以爲SQL語句導出執行計劃的優化器:
- 基於規則的優化器(RBO)
繼承自Oracle6,它使用一系列嚴格的規則來決定每個SQL語句的執行計劃。如果你知道這些規則,
你可以構造一個SQL查詢使其以指定的方式訪問數據。表的內容對於執行計劃沒有影響。
這個優化器已經不再被增強了,所以不能使用很多oracle8的特性。
- 基於成本的優化器(CBO)
從Oracle7開始引入,該優化器嘗試找到最低成本的訪問數據的方法,爲了最大的吞吐量或最快的初始響應時間。
計算使用不同的執行計劃的成本,並選擇成本最低的一個。關於表的數據內容的統計被用於確定執行計劃。
Fundamental Points 基本點
對於每個SQL語句,都有很多可能的執行計劃。“最佳計劃”永遠是“最佳計劃”,無論它如何到達。
最佳計劃可以由兩個意思:
1 此計劃使用最小的資源來處理此語句涉及到的所有行。 [叫做ALL_ROWS]
2 此計劃以最短的時間返回這個語句的第一行 。 [叫做FIRST_ROWS]
CBO不理解應用的相關特性,也不能完全理解關聯表之間的複雜關係的影響。僅有有限的信息可以用來確定最佳計劃。
CBO通過計算不同執行方案的估計成本來確定最佳計劃,並選用最低成本的計劃。因爲這個關係到相關成本的假設,
所選的計劃不一定是真的最好的計劃。這種情況經常被當作BUG報告給oracle 技術支持,因爲 CBO沒有爲一個指定方案選擇一個最佳的計劃。
二、直方圖
從版本10g開始Oracle會自動收集Histogram,Histogram是否收集取決於col_usage$中記錄的關於該列用作SQL中謂詞條件的信息和數據分佈情況.
SMON定期將shared pool中的謂詞使用狀況刷新到col_usage$表中。
例如:
Select * from tab where colA=1;
則記錄爲對colA充當 EQUALITY_PREDS—>equality predicates等式謂詞
二、CBO何時使用直方圖
有2個地方Oracle Optimizer優化器會用到Histogram:
•過濾謂詞的選擇性評估
•Join連接基數(Cardinality)評估
•在做Join連接基數(Cardinality)評估時,往往差之毫釐謬之千里:
•優化器可能選擇錯誤的Join連接方式或順序。
•例如分頁排序查詢 因爲基數評估誤差導致去用了HASH JOIN…..
三、直方圖的bucket桶數
Histogram的Buckets桶數
•對於絕大多數情況默認的75個桶總是合適的
•最大桶數= 最小值(254,其他因素限制桶數)
•若頻繁出現地distinct值的數據並不多,則將桶數設置爲大於這個數目往往是有益的。
四、直方圖的分類
版本12c之前有2種類型Histogram
1、Height Balanced Histogram高度平衡直方圖
•列值被分成多個buckets
•每個bucket包含大致一樣數目的行數
•當NDV>254時會採用高度平衡直方圖(注意dbms_stats採樣到的NDV未必是實際的NDV)
特點:
•每個buckets桶裏的行數都大致相同,除了最後一個桶
•最後一個桶中的可能比其他桶中的少
•每個桶中最大值成爲bucket value endpoint_value
•每個value值佔有一個桶的一部分,按比例
2、Frequency Histogram(Value-Based )頻率直方圖
•該列上每一個值都會具有頻率信息
•當NDV( number of distinct values)的個數<=最大桶數buckets 254個時使用頻率直方圖
特點:
•每一個bucket桶代表一個列值
•列上的所有的值均有對應的桶
•當NDV(採樣到的)<min(指定的buckets數量,254)時創建頻率直方圖
•Density = 1 / ( 2 * NumRows * A4Nulls)
五、查看
列統計信息可以按柱狀統計圖的形式存儲,柱狀統計圖爲列數據提供了準確的描述信息,尤其是在數據列有傾斜(列爲某種值的記錄行數非常多,而某種值的記錄行數又非常少)的時候。Oracle中包含兩種柱狀統計圖,高度正方圖(height-balanced)和頻率直方圖(frequency histograms),該類型存儲在視圖*TAB_COL_STATISTICS (* 可爲USER或 DBA),其取值爲HEIGHT BALANCED, FREQUENCY或 NONE
(1)高度直方圖高度直方圖中,數據列的值被分成組,每組包含的數據數據可數基本相等。比如有一個列c其值在1到100之間,當均勻分佈,其列的高度直方圖如下圖:
650) this.width=650;" src="http://report.retailsolution.cn/wp-content/uploads/2008/12/clip-image0071-thumb1.gif" border="0" width="500" height="44" style="border:none;max-width:100%;" />
每個間隔中都包含數據列的10行數據;當不均勻分佈時其列直方圖如下圖650) this.width=650;" src="http://report.retailsolution.cn/wp-content/uploads/2008/12/clip-image0081-thumb1.gif" border="0" width="500" height="44" style="border:none;max-width:100%;" />
這時,大多數數據行的值爲5。查詢時最有價值的統計信息就是各個組範圍的兩個端點的值.
查看統計信息的語法如下:
BEGIN
DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',
METHOD_OPT => 'FOR COLUMNS SIZE 6 SAL');
END;
/
SELECT column_name, num_distinct, num_buckets, histogram
FROM USER_TAB_COL_STATISTICS
WHERE table_name = 'EMP' AND column_name = 'SAL';
結果:
650) this.width=650;" src="http://report.retailsolution.cn/wp-content/uploads/2008/12/clip-image0101-thumb2.jpg" border="0" width="554" height="48" style="border:none;max-width:100%;" />
SELECT endpoint_number, endpoint_value
FROM USER_HISTOGRAMS
WHERE table_name = 'EMP' and column_name = 'SAL'
ORDER BY endpoint_number;
結果:
650) this.width=650;" src="http://report.retailsolution.cn/wp-content/uploads/2008/12/clip-image0121-thumb2.jpg" border="0" width="346" height="158" style="border:none;max-width:100%;" />
上圖中,每行對應高度直方圖中的每個間隔。
(2)頻率直方圖在頻率直方圖中,列中每個唯一數據相當於高度直方圖中的每個間隔,其高度對應該數據在列中出現的次數。當列中distinct值得個數小於或等於直方圖的分格段的個數(即num_buckets的值)時,頻率直方圖會被自動建立。查看頻率直方圖的語法如下:
BEGIN
DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',
METHOD_OPT => 'FOR COLUMNS SIZE 12 SAL');
END;
SELECT column_name, num_distinct, num_buckets, histogram
FROM USER_TAB_COL_STATISTICS
WHERE table_name = 'EMP' AND column_name = 'SAL';
結果:
650) this.width=650;" src="http://report.retailsolution.cn/wp-content/uploads/2008/12/clip-image0141-thumb1.jpg" border="0" width="519" height="44" style="border:none;max-width:100%;" />
SELECT endpoint_number, endpoint_value
FROM USER_HISTOGRAMS
WHERE table_name = 'EMP' and column_name = 'SAL'
ORDER BY endpoint_number;
結果:
650) this.width=650;" src="http://report.retailsolution.cn/wp-content/uploads/2008/12/clip-image0161-thumb1.jpg" border="0" width="349" height="246" style="border:none;max-width:100%;" />
整理的時候發現下面兩篇文章也不錯
http://blog.csdn.net/outget1/article/details/4833881
http://hi.baidu.com/wuzhanyin/item/6b0d35dff9316439e3108fed
本文出自 “無雙城” 博客,請務必保留此出處http://929044991.blog.51cto.com/1758347/1264534