Oracle裏的優化器

1 What

優化器(Optimizer) 是Oracle數據庫中內置的一個 核心子系統

其目的是:按照一定的判斷原則來得到它認爲的目標SQL在當前情形下最高效的執行路徑(Access Path)。

根據判斷原則,可分爲 RBOCBO 兩種類型的優化器:

  • RBO (Rule-Based Optimizer):基於(內置的)規則的優化器,規則 硬編碼在Oracle數據庫的代碼中;
  • CBO(Cost-Based Optimizer):基於成本的優化器,成本根據目標SQL語句所涉及的表、索引、列等相關對象的統計信息計算出來。

以下是Oracle數據庫裏的SQL語句的執行過程示意圖:
在這裏插入圖片描述

1.1 RBO ---- 基於規則的優化器

Oracle一共有15個等級的執行路徑,默認等級值低的執行路徑的執行效率會比等級值高的執行效率要高;所以RBO會從決定目標SQL的執行計劃中選擇一條等級值最低的執行路徑來作爲執行計劃。

開啓RBO模式:

alter session set optimizer_mode='RULE';

如果RBO選擇的執行計劃不是當前情形下最優的執行計劃,有以下幾個辦法調整:

  1. 使用 RULE HintDRIVING_SITE Hint 可以調整RBO的執行計劃且不自動啓用CBO;

  2. 等價改下目標SQL:
    比如在sql的where條件中number或者date類型的列加0

    select * from 表格 where a+0 > 參數
    

    如果是varchar2類型的,加可以加個空字符串

    select * from 表格 where a || '' = 參數
    

    對於執行路徑一樣的情況:假如出現執行路徑一樣的情況,這時候就要根據數據字典緩存先後順序來確定等級,確定哪條作爲執行計劃。

  3. 通過調整相關對象在數據字典緩存中的緩存順序,改變目標SQL中所涉及的各個對象在該SQL文本中出現的先後順序來調整執行計劃。

1.2 CBO ---- 基於成本的優化器

CBO會從目標SQL諸多可能的執行路徑中選擇一條成本值最小的路徑來作爲執行計劃;

各路執行路徑的成本值是根據目標SQL語句所涉及的表、索引、列等相關對象的統計信息計算出來的;

成本 即 對執行目標SQL所要耗費的I/O、CPU和網絡資源的一個估算值

CBO會認爲消耗系統I/O和CPU資源最少的執行路徑即最佳選擇

1.2.1 Cardinality 集的勢

表示對目標SQL的某個具體步驟的執行結果所包含記錄數估算

值越大,對應成本值越大

1.2.2 Selectivity 可選擇率

其公式表示:
Selectivity=Selectivity =\frac{施加指定謂詞條件後返回結果集的記錄數}{未施加任何謂詞條件的原始結果集的記錄數} \quad

可見,可選擇率爲1時可選擇性最差。

也可以這麼表示:
Selectivity=Computed CardinalityOriginal CardinalitySelectivity =\frac{Computed\ Cardinality}{Original\ Cardinality} \quad

Computed Cardinality = Original Cardinality * Selectivity

在目標列沒有直方圖且NULL值的情況下,用目標列做等值查詢的選擇率是:
Selectivity=1Num_DistinctSelectivity =\frac{1}{Num\_Distinct} \quad

Oracle 10g開始,Oralce在解析目標SQL時,默認使用CBO

1.2.2 Transitivity 可傳遞性

CBO在查詢轉換中做的第一件事,即對原目標SQL做簡單的等價改寫(僅適用於CBO):

在原目標SQL上加上根據該SQL現有的謂詞條件推算出來的新的謂詞條件

簡單來說就是從: a = b and b = c 推算出 ----> a = c.

2 Base Info

2.1 優化器模式

不同模式下的計算成本值的方式不同

其控制參數爲 OPTIMIZER_MODE 決定 :

  1. RULE :使用RBO解析
  2. CHOOSE:Oracle 9i的默認使用值,只要該SQL中所涉及的對象 有一個有統計信息,那麼解析該SQL時就會使用CBO
  3. First_Rows_n(n = 1, 10, 100, 1000 ):以最快的響應速度返回頭n(n = 1, 10, 100, 1000 )條記錄所對應的執行步驟的成本值修改爲很小的值
  4. All_Rows :Oracle 10g及以後的版本中的默認使用值,側重於最佳吞吐量(即最小的系統I/O和COU資源的消耗量)

2.2 結果集

指包含指定執行結果的集合

對於CBO而言,對應執行計劃中的Rows反映的就是CBO對於相關執行步驟所對應的輸出結果集的記錄數(即Cardinality)的估算值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章