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