Oracle Optimizer:遷移到使用基於成本的最佳化器-----系列1.1
來源:互聯網
上載者:User
oracle|最佳化
Oracle Optimizer:遷移到使用基於成本的最佳化器-----系列1.1
如果在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. 為什麼要最佳化?
你知道!最佳化一個針對執行時以最少時間和最佳的資源利用的查詢,意味著快速和高效。對於資源,意味著CPU利用情況,磁碟輸入輸出,記憶體消耗和其它範圍的網路操作。不考慮你的伺服器在這些資源上是多麼充足,不適當或較不理想的的查詢總是付出昂貴的代價並拖慢你的任務,或者對伺服器上的其它處理產生影響.依賴於各種因素的查詢範圍是昂貴的,包括抽取的結果集大小,掃描檢索結果集的資料的大小和系統的即時負荷。適當的文法最佳化將節省使用者已耗用時間的消耗和不必要的資源利用。
3. 可用的最佳化器
Oracle有兩種模式的最佳化器,基於規則和基於成本,它決定了最佳的執行計畫。
本篇重點介紹CBO,簡要概述RBO.
3.1 基於規則的最佳化(RBO)
RBO遵循簡單的分級方法學。RBO使用15種層級要點,當接收到查詢,最佳化器將評估使用到的要點數目,然後選擇最佳層級(最少的數量)的執行路徑來執行查詢,15個要點層級如下:
.使用ROWID的單獨記錄
.使用簇串連的單獨記錄.
.使用散列簇主鍵的單獨記錄.
.使用主鍵的單獨記錄.
.簇串連.
.散列簇串連
.索引簇主鍵.
.複合主鍵.
.單列主鍵.
.索引列的結合範圍尋找.
.索引列的非結合範圍尋找.
.排序合并串連.
.索引列的最大max或min
.索引列的order by.
.全表掃描.
舉例來說,如果產生一個在where子句條件中精確匹配兩列的表的查詢,一列擁有主鍵(對應於使用主鍵的單獨記錄.)而別一列擁有非主鍵(對應於單列主鍵),則RBO更喜歡主鍵(對應於使用主鍵的單獨記錄.),而不是非主鍵(對應於單列主鍵).
當在一個查詢中涉及到要訪問多個表,最佳化器需要確定那個表是驅動表.RBO產生一組串連順序,每一個表做為第一個表,然後最佳化器從執行計畫的結果集中選擇最理想的計劃.最佳化器評估不同條件諸如(最少的嵌套迴圈,最少的排序合并串連,最佳層級的表訪問路徑,等等),如果仍然不能比較出結果,則最佳化器會選取查詢的FROM子句第一個表作為驅動表.因此,常規條件下的編碼實踐將把驅動表放在最右邊.其它的表按訪問順序跟隨在FROM子句中. 也就是說,表的順序是從右至左的訪問順序。
請注意,用以搜尋列的操作符也扮演著決定層級的角色,有時甚至考慮索引的時間作為層級
例如下面的表證明了在列1和列2上的索引使用方式,如果它們兩個在where子句上用”=”串連
例:
select * 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早期版本的大多數設定作為執行計畫路徑,這種選擇是統一的。查詢總會產生同樣的方法對於運行在不同資料庫上相同的應用程式(待續).