溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle如何使用Optimizer_mode參數(shù)來(lái)控制優(yōu)化器

發(fā)布時(shí)間:2021-12-13 14:03:49 來(lái)源:億速云 閱讀:269 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫(kù)

這篇文章主要介紹了Oracle如何使用Optimizer_mode參數(shù)來(lái)控制優(yōu)化器,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

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ù)的具體解釋?zhuān)?/p>

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)化模式了。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Oracle如何使用Optimizer_mode參數(shù)來(lái)控制優(yōu)化器”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI