天天看點

優化器optimizer_mode辨別

oracle為基于成本的優化器提供了3個變體,這三個變體中的代碼中建構了不同的限制,但是它們都遵循同一政策——即針對某個SQL語句,尋找能夠最少的資源消耗來達到目的的執行機制。這三個變體可以通過optimizer_mode辨別:

1、all_rows:優化器将尋找能夠在是短的時間内完成語句的執行計劃(通常表示“傳回所有回”)。該變體沒有在代碼中建構特别的限制。

2、first_rows_N:N可以為1、10、100或1000(如果需要進行進一步優化,可以采用fist_rows(n)提示的形式,其中n可以是任意正整數)。優化器首先通過徹底分析第一個連接配接順序(join order)來估計傳回行的總數目。這就可以知道查詢可能獲得的整個資料集的片斷,并重新啟動整個優化程序,其目标在于找到能夠以最小的資源消耗傳回整個資料片斷的執行計劃。該選項是在Oracle 9i中引入的。

3、first_rows:在Oracle 9i這一選項已經過時,但是由于向後相容的原因,仍然保留了這一堪。該選項的作用在于尋找能夠在最短的時間内傳回結果集的第一行的執行計劃。該變體的代碼中建構了幾個高層限制。例如,有一個限制就是“避免歸并連接配接和連接配接,除非除此以外隻能對内部(第二個)表進行全表掃描的嵌套循環”。這一規則傾向于促使優化器使用索引通路路徑,偶爾會出現非常不恰當的通路路徑。

參數optimizer_mode還存在其他兩個選項(即使在Oracle 10g中也是如此),分别為rule和choose。由于基于規則的優化(Rule Based Optimization)在多年前就已過時(隻有某些内部SQL仍在使用提示),而且Oracle 10g中最終不再支援RBO。

對于choose模式來說,它為優化器提供了一種運作時選擇方式,可以在基于規則的優化和all_rows之間進行選擇。

FROM:基于成本的Oracle優化法則

繼續閱讀