Oracle Optimizer:遷移到使用基于成本的優化器-----系列1.1
2024-08-29 13:49:20
供稿:網友
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早期版本的大多數設置作為執行計劃路徑,這種選擇是統一的。
查詢總會產生同樣的方法對于運行在不同數據庫上相同的應用程序(待續).