Oracle Optimizer:遷移到使用基於成本的最佳化器-----系列1.1 (轉)

amyz發表於2007-08-17
Oracle Optimizer:遷移到使用基於成本的最佳化器-----系列1.1 (轉)[@more@]

Optimizer:遷移到使用基於成本的器-----系列1.1:namespace prefix = o ns = "urn:schemas--com::office" />

 

如果在Oracle以前的版本(7.0或更早)中開發應用,會採用基於規則的最佳化器(譯者注:以下稱RBO),本篇將幫助你理解Oracle最佳化器並遷移到基於成本最佳化器(譯者注:以下稱CBO)的幾種高效方法.下面是五大部分的第一部分

 

第一部分

1.  什麼是最佳化器?

2.  為什麼要最佳化?

3.  可用的最佳化器.

4.  為什麼要移除RBO?

5.  為什麼要遷移到CBO?

 

第二部分

1.  影響CBO的初始化引數.

2.  影響CBO的Oracle內部引數.

 

第三部分

1.  升級至CBO的設定變化.

2.  生成統計資料

3.  DML監視

 

第四部分

1.  提示.

2.  概要

3.  SYS的統計資料

 

第五部分

1.  新的

2.  怎樣在CBO中分析計劃

3.  Oracle Application 11i的CBO詳細資訊

4.  結論

 

1.  什麼是最佳化器?

在Oracle中,執行一個查詢可能有不只一種方法,擁有最佳等級的執行計劃,或者說是最度最少成本返回輸出並達到最佳資源利用的執行計劃.最佳化器生成執行計劃。最佳化器是執行在資料庫中致力以得到基於不同條件下執行路徑列表的引擎並且選擇執行查詢的最高效執行計劃。一旦執行計劃生成,它將執行輸出。在Oracle中最佳化器與DML語句有關.

 

2.  為什麼要最佳化?

你知道!最佳化一個針對執行時以最少時間和最佳的資源利用的查詢,意味著快速和高效。對於資源,意味著利用情況,輸入輸出,消耗和其它範圍的操作。不考慮你的在這些資源上是多麼充足,不適當或較不理想的的查詢總是付出昂貴的代價並拖慢你的任務,或者對伺服器上的其它處理產生影響.依賴於各種因素的查詢範圍是昂貴的,包括抽取的結果集大小,掃描檢索結果集的資料的大小和的即時負荷。適當的語法最佳化將節省執行時間的消耗和不必要的資源利用。

 

3.  可用的最佳化器

Oracle有兩種模式的最佳化器,基於規則和基於成本,它決定了最佳的執行計劃。

本篇重點介紹CBO,簡要概述RBO.

 

3.1  基於規則的最佳化(RBO)

RBO遵循簡單的分級方法學。RBO使用15種級別要點,當接收到查詢,最佳化器將評估使用到的要點數目,然後選擇最佳級別(最少的數量)的執行路徑來執行查詢,15個要點級別如下:

 

  .使用ROWID的單獨記錄

  .使用簇連線的單獨記錄.

  .使用雜湊簇主鍵的單獨記錄.

  .使用主鍵的單獨記錄.

  .簇連線.

  .雜湊簇連線

  .簇主鍵.

  .複合主鍵.

  .單列主鍵.

  .索引列的結合範圍查詢.

  .索引列的非結合範圍查詢.

 .排序合併連線.

 .索引列的最大max或min

 .索引列的order by.

 .全表掃描.

  舉例來說,如果生成一個在where子句條件中精確匹配兩列的表的查詢,一列擁有主鍵(對應於使用主鍵的單獨記錄.)而別一列擁有非主鍵(對應於單列主鍵),則RBO更喜歡主鍵(對應於使用主鍵的單獨記錄.),而不是非主鍵(對應於單列主鍵).

當在一個查詢中涉及到要訪問多個表,最佳化器需要確定那個表是表.RBO生成一組連線順序,每一個表做為第一個表,然後最佳化器從執行計劃的結果集中選擇最理想的計劃.最佳化器評估不同條件諸如(最少的巢狀迴圈,最少的排序合併連線,最佳級別的表訪問路徑,等等),如果仍然不能比較出結果,則最佳化器會選擇查詢的FROM子句第一個表作為驅動表.因此,常規條件下的編碼實踐將把驅動表放在最右邊.其它的表按訪問順序跟隨在FROM子句中. 也就是說,表的順序是從右到左的訪問順序。

請注意,用以搜尋列的運算子也扮演著決定級別的角色,有時甚至考慮索引的時間作為級別

例如下面的表證明瞭在列1和列2上的索引使用情況,如果它們兩個在where子句上用”=”連線

例:


* from am79 where col1 = 1 and col2 = 'amar';


  -- here both col1 and col2 are indexed.


 


-------------------------------------------------------------------------------------


  Normal index types  |  Index used in RBO


column1(a)  column2(b)  column1+column2(c)  | 


  -------------------------------------------------------------------------------------


non-unique  non-unique  c


non-unique  non-unique  a + b


non-unique  non-unique  non-unique  c


unique  non-unique  a


unique  non-unique  a


unique  unique  b (the most recent index created)


unique  unique  unique  c


-------------------------------------------------------------------------------------


-The above is tested on Oracle 8.1.7.1.


-In case of non-unique single column indexes, both indexes are used.


-In case of unique indexes, they are not combined for execution plan, any one is taken.


-Preference is given to the index available with the "=" operator column, than with


others operators.


-Don't create bitmap & function-based indexes, these will not work in RBO.


-------------------------------------------------------------------------------------


 

RBO偏好Oracle早期版本的大多數設定作為執行計劃路徑,這種選擇是統一的。查詢總會產生同樣的方法對於執行在不同資料庫上相同的應用程式(待續).

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-963764/,如需轉載,請註明出處,否則將追究法律責任。

相關文章