文章目錄
1 What
優化器(Optimizer) 是Oracle數據庫中內置的一個 核心子系統。
其目的是:按照一定的判斷原則來得到它認爲的目標SQL在當前情形下最高效的執行路徑(Access Path)。
根據判斷原則,可分爲 RBO 和 CBO 兩種類型的優化器:
- 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選擇的執行計劃不是當前情形下最優的執行計劃,有以下幾個辦法調整:
-
使用 RULE Hint 和 DRIVING_SITE Hint 可以調整RBO的執行計劃且不自動啓用CBO;
-
等價改下目標SQL:
比如在sql的where條件中對number或者date類型的列加0,select * from 表格 where a+0 > 參數
如果是varchar2類型的,加可以加個空字符串
select * from 表格 where a || '' = 參數
對於執行路徑一樣的情況:假如出現執行路徑一樣的情況,這時候就要根據數據字典緩存先後順序來確定等級,確定哪條作爲執行計劃。
-
通過調整相關對象在數據字典緩存中的緩存順序,改變目標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 可選擇率
其公式表示:
可見,可選擇率爲1時可選擇性最差。
也可以這麼表示:
即 Computed Cardinality = Original Cardinality * Selectivity
在目標列沒有直方圖且NULL值的情況下,用目標列做等值查詢的選擇率是:
從 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
決定 :
- RULE :使用RBO解析
- CHOOSE:Oracle 9i的默認使用值,只要該SQL中所涉及的對象 有一個有統計信息,那麼解析該SQL時就會使用CBO
- First_Rows_n(n = 1, 10, 100, 1000 ):以最快的響應速度返回頭n(n = 1, 10, 100, 1000 )條記錄所對應的執行步驟的成本值修改爲很小的值
- All_Rows :Oracle 10g及以後的版本中的默認使用值,側重於最佳吞吐量(即最小的系統I/O和COU資源的消耗量)
2.2 結果集
指包含指定執行結果的集合
對於CBO而言,對應執行計劃中的Rows反映的就是CBO對於相關執行步驟所對應的輸出結果集的記錄數(即Cardinality)的估算值。