Oracle優化器和直方圖

一、優化器的分類

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等式謂詞

650) this.width=650;" src="http://img1.51cto.com/attachment/201308/110610877.png" title="1122.png" />

二、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章