文章詳情頁
Oracle Optimizer:遷移到使用基于成本的優(yōu)化器-----系列1.1
瀏覽:6日期:2023-11-18 17:02:53
Oracle Optimizer:遷移到使用基于成本的優(yōu)化器-----系列1.1 假如在Oracle以前的版本(7.0或更早)中開發(fā)應(yīng)用程序,數(shù)據(jù)庫會采用基于規(guī)則的優(yōu)化器(譯者注:以下稱RBO),本篇將幫助你理解Oracle優(yōu)化器并遷移到基于成本優(yōu)化器(譯者注:以下稱CBO)的幾種高效方法.下面是五大部分的第一部分第一部分1. 什么是優(yōu)化器?2. 為什么要優(yōu)化?3. 可用的優(yōu)化器.4. 為什么要移除RBO?5. 為什么要遷移到CBO?第二部分1. 影響CBO的初始化參數(shù).2. 影響CBO的Oracle內(nèi)部參數(shù).第三部分1. 升級至CBO的設(shè)置變化.2. 生成統(tǒng)計資料3. DML監(jiān)視第四部分1. 提示.2. 存儲概要3. SYS模式的統(tǒng)計資料第五部分1. 新的權(quán)限2. 怎樣在CBO中分析執(zhí)行計劃3. Oracle Application 11i的CBO具體信息4. 結(jié)論1. 什么是優(yōu)化器?在Oracle中,執(zhí)行一個查詢可能有不只一種方法,擁有最佳等級的執(zhí)行計劃,或者說是最快速度最少成本返回輸出并達(dá)到最佳資源利用的執(zhí)行計劃.優(yōu)化器生成執(zhí)行計劃。優(yōu)化器是運行在數(shù)據(jù)庫中致力以得到基于不同條件下執(zhí)行路徑列表的引擎并且選擇運行查詢的最高效執(zhí)行計劃。一旦執(zhí)行計劃生成,它將執(zhí)行輸出。在Oracle中優(yōu)化器與DML語句有關(guān).2. 為什么要優(yōu)化?你知道!優(yōu)化一個針對執(zhí)行時以最少時間和最佳的資源利用的查詢,意味著快速和高效。對于資源,意味著CPU利用情況,磁盤輸入輸出,內(nèi)存消耗和其它范圍的網(wǎng)絡(luò)操作。不考慮你的服務(wù)器在這些資源上是多么充足,不適當(dāng)或較不理想的的查詢總是付出昂貴的代價并拖慢你的任務(wù),或者對服務(wù)器上的其它處理產(chǎn)生影響.依靠于各種因素的查詢范圍是昂貴的,包括抽取的結(jié)果集大小,掃描檢索結(jié)果集的數(shù)據(jù)的大小和系統(tǒng)的即時負(fù)荷。適當(dāng)?shù)恼Z法優(yōu)化將節(jié)省用戶運行時間的消耗和不必要的資源利用。3. 可用的優(yōu)化器Oracle有兩種模式的優(yōu)化器,基于規(guī)則和基于成本,它決定了最佳的執(zhí)行計劃。本篇重點介紹CBO,簡要概述RBO.3.1; 基于規(guī)則的優(yōu)化(RBO)RBO遵循簡單的分級方法學(xué)。 RBO使用15種級別要點,當(dāng)接收到查詢,優(yōu)化器將評估使用到的要點數(shù)目,然后選擇最佳級別(最少的數(shù)量)的執(zhí)行路徑來運行查詢,15個要點級別如下: .使用ROWID的單獨記錄 .使用簇連接的單獨記錄. .使用散列簇主鍵的單獨記錄. .使用主鍵的單獨記錄. .簇連接. .散列簇連接 .索引簇主鍵. .復(fù)合主鍵. .單列主鍵. .索引列的結(jié)合范圍查找. .索引列的非結(jié)合范圍查找..排序合并連接..索引列的最大max或min.索引列的order by..全表掃描. 舉例來說,假如生成一個在where子句條件中精確匹配兩列的表的查詢,一列擁有主鍵(對應(yīng)于使用主鍵的單獨記錄.)而別一列擁有非主鍵(對應(yīng)于單列主鍵),則RBO更喜歡主鍵(對應(yīng)于使用主鍵的單獨記錄.),而不是非主鍵(對應(yīng)于單列主鍵).當(dāng)在一個查詢中涉及到要訪問多個表,優(yōu)化器需要確定那個表是驅(qū)動表.RBO生成一組連接順序,每一個表做為第一個表,然后優(yōu)化器從執(zhí)行計劃的結(jié)果集中選擇最理想的計劃.優(yōu)化器評估不同條件諸如(最少的嵌套循環(huán),最少的排序合并連接,最佳級別的表訪問路徑,等等),假如仍然不能比較出結(jié)果,則優(yōu)化器會選擇查詢的FROM子句第一個表作為驅(qū)動表.因此,常規(guī)條件下的編碼實踐將把驅(qū)動表放在最右邊.其它的表按訪問順序跟隨在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 uniquenon-unique;;a uniquenon-unique;;a uniqueunique b (the most recent index created) uniqueunique; 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早期版本的大多數(shù)設(shè)置作為執(zhí)行計劃路徑,這種選擇是統(tǒng)一的。 查詢總會產(chǎn)生同樣的方法對于運行在不同數(shù)據(jù)庫上相同的應(yīng)用程序(待續(xù)).
標(biāo)簽:
Oracle
數(shù)據(jù)庫
排行榜
