本篇內(nèi)容介紹了“Oracle中使用optimizer_mode參數(shù)的意義”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序定制開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了伽師免費(fèi)建站歡迎大家使用!
Oracle使用Optimizer_mode參數(shù)來(lái)控制優(yōu)化器的偏好,9i常用的幾個(gè)參數(shù)有:first_rows,all_rows,first_rows_N,rule
,choose等。而10g少了rule和choose.Oracle 在執(zhí)行SQL語(yǔ)句時(shí),有兩種優(yōu)化方法:即基于規(guī)則的RBO和基于代價(jià)的CBO。 在SQL執(zhí)行的時(shí)候,到底采用何種優(yōu)化方法,就由Oracle參數(shù) optimizer_mode 來(lái)決定。
Rule Based Optimizer(RBO)基于規(guī)則
Cost Based Optimizer(CBO)基于成本,或者講統(tǒng)計(jì)信息
SQL> show parameter optimizer_mode;
NAME TYPE VALUE
optimizer_mode string ALL_ROWS
oracle10g開(kāi)始默認(rèn)是all_rows
ALL_ROWS不管是不是有統(tǒng)計(jì)信息,全部采用基于成本的優(yōu)化方法,返回最大數(shù)的量數(shù)據(jù)
FIRST_ROWS_n不管是不是有統(tǒng)計(jì)信息,全部采用基于成本的優(yōu)化方法并以最快的速度,返回前N行記錄
FIRST_ROWS使用成本和試探法相結(jié)合的方法,查找一種可以最快返回前面少數(shù)行的方法
第一個(gè)是返回所有行的最小代價(jià),第二個(gè)是返回前N行的最小代價(jià),最后一個(gè)是返回前面的少量行的最好計(jì)劃
修改全局
alter system set optimizer_mode=all_rows;
修改當(dāng)前session
alter session set optimizer_mode=all_rows;
幾個(gè)參數(shù)的具體解釋:
optimizer_mode =choose
這個(gè)是Oracle的默認(rèn)值。采用這個(gè)值時(shí),Oracle即可以采用基于規(guī)則RBO,也可以采用基于代價(jià)的CBO,到底使用那個(gè)值,取決于當(dāng)前SQL的被訪問(wèn)的表中是不是有可以使用的統(tǒng)計(jì)信息。如果有多個(gè)被訪問(wèn)的表,其中有一個(gè)或多個(gè)有統(tǒng)計(jì)信息,那么Oralce會(huì)對(duì)沒(méi)有統(tǒng)計(jì)信息的表進(jìn)行采樣統(tǒng)計(jì)(即不全部采樣),統(tǒng)計(jì)完成后,使用基于代價(jià)的優(yōu)化方法CBO。如果所有被訪問(wèn)的表都沒(méi)有統(tǒng)計(jì)信息,Oracle就會(huì)采用基于規(guī)則的優(yōu)化方法RBO。
Optimizer_mode=First_rows
在oracle 9i之后這一選項(xiàng)已經(jīng)過(guò)時(shí),出于向后兼容的目的保留了這一選項(xiàng),該選項(xiàng)的作用在于尋找能夠在最短的時(shí)間內(nèi)返回結(jié)果集的第一行的執(zhí)行計(jì)劃。這一規(guī)則傾向于促使優(yōu)化器使用索引訪問(wèn)路徑,偶爾會(huì)出現(xiàn)非常不恰當(dāng)?shù)脑L問(wèn)路徑。
設(shè)置為這種CBO模式以后,SQL語(yǔ)句返回結(jié)果的速度會(huì)盡可能的快,而不管系統(tǒng)全部的查詢是否會(huì)耗時(shí)較長(zhǎng)或者耗系統(tǒng)資源過(guò)多。由于利用索引會(huì)使查詢速度加快,所以 first_rows 優(yōu)化模式會(huì)在全表掃描上進(jìn)行索引掃描。這種優(yōu)化模式一般適合于一些OLTP系統(tǒng),滿足用戶能夠在較短時(shí)間內(nèi)看到較小查詢結(jié)果集的要求。
Optimizer_mode=all_rows
優(yōu)化器將尋找能夠在最短的時(shí)間內(nèi)完成語(yǔ)句的執(zhí)行計(jì)劃。
設(shè)置為這種CBO模式以后,將保證消耗的所有計(jì)算資源最小,盡管有時(shí)查詢結(jié)束以后沒(méi)有結(jié)果返回。all_rows 的優(yōu)化模式更傾向于全表掃描,而不是全索引掃描和利用索引排序,因此這種優(yōu)化模式適合于數(shù)據(jù)查看實(shí)時(shí)性不是那么強(qiáng)的數(shù)據(jù)倉(cāng)庫(kù)、決策支持系統(tǒng)和面向批處理的數(shù)據(jù)庫(kù)(batch-oriented databases)等。
Optimizer_mode=first_rows_N
N的值可以為1,10,100,1000,優(yōu)化器首先通過(guò)徹底分析第一個(gè)連接順序來(lái)估計(jì)返回行的總數(shù)目。這樣就可以知道查詢可能獲得的整個(gè)數(shù)據(jù)集的片段,并重新啟動(dòng)整個(gè)優(yōu)化過(guò)程,其目標(biāo)在于找到能夠以最小的資源消耗返回整個(gè)數(shù)據(jù)片段的執(zhí)行計(jì)劃。
Oracle 9i 對(duì)一些預(yù)期返回結(jié)果集的數(shù)據(jù)量小的SQL語(yǔ)句優(yōu)化模式進(jìn)行了加強(qiáng),增加了四個(gè)參數(shù)值:first_rows_1、first_rows_10、 first_rows_100、first_rows_1000。CBO通過(guò)first_rows_n 中的 n 值,決定了返回結(jié)果集數(shù)量的基數(shù),我們可能僅僅需要查詢結(jié)果集中的一部分,CBO就根據(jù)這樣的 n 值來(lái)決定是否使用索引掃描。
optimizer_mode = rule
基于規(guī)則的優(yōu)化器模式,RBO,是早期Oracle版本使用過(guò)的一種優(yōu)化模式。由于 RBO不支持自1994年Oracle版本的新特性,如 bitmap indexes,table partitions,function-based indexes等,所以在以后Oracle版本中已經(jīng)不再更新RBO,并且也不推薦用戶使用RBO這種優(yōu)化模式了。
“Oracle中使用optimizer_mode參數(shù)的意義”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!