Oracle最佳化器(RBO與CBO)

liuhaimiao發表於2015-08-18

Oracle的最佳化器有兩種,基於規則的最佳化器(RBO)和基於代價的最佳化器(CBO)。

在8i之前,Oracle使用的是RBO(Rule Based Optimizer,基於規則的最佳化器),他的執行非常簡單,就是在最佳化器裡面嵌入15中規則,執行SQL語句符合哪種規則,就按照規則定製出相應的SQL執行計劃。由於他是一種過時呆板的最佳化器,在10g以後的版本中已經被踢出掉了。

從8i開始,Oracle引入了CBO(Cost Based Optimizer,基於代價的最佳化器),他的思路是讓Oracle獲取所有的執行計劃的相關資訊,透過這些資訊做計算分析,最後得出一個代價最小的執行計劃作為最終的執行計劃。

CBO最佳化器有兩種可選的執行模式:

FIRST_ROWS(n)

ALL_ROWS

當設定最佳化器模式為:FIRST_ROWS(n)時,意味著Oracle在執行SQL語句時,優先考慮將結果集中的前n條記錄以最快的速度反饋回來,而其他結果並不需要同事反饋,也就是說在處理資料的時候,後面的資料可能還沒提取出來,前面的資料已經返回給使用者了,這種需求在網站搜尋或者BBS的分頁上經常看到。比如每次只顯示查詢資訊的前20條,這時設定FIRST_ROWS(20)就非常合適。對於分頁操作,越靠前的頁,顯示結果需要的時間將越短。

下面舉一個典型的分頁的例子:

idle> select /*+first_rows(10)*/ b.x,b.y

2 from (select /*+first_rows(10)*/ a.*,rownum

3 from (select /*+first_rows(10)*/ from t order by x) a

4 where rownum<=20) b

5 where rownum>=10;

需要注意的是排序使用的X必須建立有索引,否則CBO會忽略FIRST_ROWS(n)而使用ALL_ROWS.

CBO的模式為ALL_ROWS時,意味著我們需要Oracle以最快的速度將SQL執行完畢,將結果集全部返回。它和FIRST_ROWS(n)的區別在於,ALL_ROWS強調整體的執行效率,而FIRST_ROWS(n)強調以最快的速度返回前n條記錄。ALL_ROWS在OLAP系統中使用的比較多,它的目的在於快速獲取執行結果的最後一條記錄。

可以透過下面語句修改optimizer_mode

alter system set optimizer_mode=all_rows scope=both;

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/223653/viewspace-1775692/,如需轉載,請註明出處,否則將追究法律責任。

相關文章