優化器是oracle中一個核心的子系統,也就是說是oracledatabase 的一個核心組件
優化器的目的是按照一定的判斷原則來得到它認爲目標sql的執行路徑,爲了得到目標sql的執行計劃
oracle的優化器分爲基於規則和基於成本的優化器
RBO:RULE-BASE Optimizer:它判斷的原則是基於oracle內置的一組規則,RBO根據目標sql的諸多可能的執行路徑中選擇一條作爲執行計劃。
CBO:COST-BASE Optimizer:它判斷的原則是爲成本,CBO會從sql諸多可執行的路徑中選擇成本值最小的一條路徑作爲執行計劃,它的執行
路徑根據目標sql所設計的表,索引,列等相關的統計信息計算得出。
基於成本的優化器
基於成本的優化器oracle通過硬編碼的規則在數據庫代碼中的一些列固定的規則:oracle會實現給各種類型的執行路徑一個等級,一共有15個等級,從1到15,
低等級的執行路徑的執行效率會比高等級的執行效率高。
缺點:1、執行計劃一旦出了問題,很難調整
2、RBO對執行計劃調整的方法就是等價改寫mubiaosql。
3、如果出現2個或者兩個以上的等級相同的執行路徑,RBO會根據數據字典緩存中的緩存順序和目標sql所涉及的各個對象在目標sql所涉及的各個對象在目標
sql文本中出現的先後順序來綜合判斷。
基於成本的優化器
從oracle 7開始,引入了cbo,在選擇目標sql的執行計劃時,所用的判斷原則爲成本,它會從目標sql中選擇一條成本值最小的執行路徑作爲其執行計劃,各條執
行路徑的成本值是根據目標sql語句所涉及的表,索引,列等相關對象的統計信息計算出來
成本值得是oracle根據相關對象的統計信息計算出來的一個值,它實際上代表了oracle根據相關統計信息估算出來的目標sql的對應自行步驟的io,cpu和網絡消耗
的資源,這樣就意味着oracle數據庫實際上就是對執行目標sql索要耗費的io,cpu和網絡資源你的一個估算值
cardinality
集的勢:它是指指定集合所包含的記錄數,說白了就是指定結果集的行數。
cardinality實際上表示對目標sql的某個具體執行步驟的執行結果所包含記錄數的估算,當然,如果是針對整個目標sql,那麼cardinailty就表示對該sql最終執行
結果所包含記錄數的估算。
它和成本值的估算嘻嘻相關,因爲oracle得到指定結果集所需要耗費的io資源可以近似看做隨着該結果集所包含的記錄數的遞增而遞增,所以某個執行步驟所
對應的cardinailty的值越大,那麼它所對應的成本值也就越大,這個步驟所在的執行路徑的總成本也就越大。
可選擇性
可選擇性selectivity是指施加指定爲此條件後返回結果集的記錄數佔未施加任何謂詞條件的原始結果集的記錄數的比率
可選擇率的值越大,就意味着返回結果集額的cardinailty的值越大,所以估算出來的成本也就越大
可傳遞性
可傳遞性是指CBO可能會對原目標sql做簡單的等價改寫,即在原目標sql上根據該sql現有的謂詞條件推算出來的新的謂詞條件,這麼做的目的是提供更多的
執行路徑給cbo做選擇,進而增加得到更高效執行計劃。
oracle的可傳遞性分爲:
1、簡單的爲此傳遞
2、連接謂詞傳遞
3、外連接謂詞傳遞
CBO的侷限性
1、CBO會默認目標sql語句wehere條件中出現的各個列之間是獨立的,沒有關聯關係
2、CBO會假設所有的目標sql都是單獨執行的,並且互不干擾
3、CBO對直方圖統計信息有諸多限制
4、CBO在解析奪標關聯的目標sql時,可能會漏選正確的執行計劃
優化器的模式
在oracle數據庫中,優化器的模式是由參數OPTIMIZER_MODE的值決定的,OPTIMIZER_MODER的值可能是
RULE,CHOOSE,FIRST_ROWS_n,FIRST_ROWS,ALL_ROWS
1、RULE 表示oracle使用RBO來解析目標sql
2、CHOOSE是oracle9i中默認值,它表示racle在解析目標sql時是使用RBO還是CBO取決於該sql中設計的表對象是否有統計信息
3、FIRST_ROWS_n:oracle會使用CBO解析目標,且此事在計算該sql的各種執行路徑的成本時,側重點在於以最快的響應速度返回頭N條記錄
4、FIRST_ROWS:是oracle9i中已經過時的參數,表示oracle在解析母校sql時會聯合使用CBO和RBO
5、ALL_ROWS:oracle10G以後以及後續oracle數據庫版本中OPTIMIZE_MODE的默認值,它表示oracle會使用CBO來解析mubiaosql,且此事
CBO在計算該sql的各條執行路徑的成本值時的側重點在於最佳的吞吐量
結果集
結果集是指包含指定執行結果的集合。
訪問數據的方法:訪問表,訪問索引
訪問表的方法
全表掃描 是指oralce在訪問目標表裏的數據時,會從佔用的第一個區的第一個塊開始掃描,一直掃描到該表的高水位線,這段範圍內所有的數據塊,
oracle都必須讀取到。
全表掃描並非不好,事實上oracle在做全表掃描操作時會使用多塊讀,這在目標的數據量不大時候執行效率很高,但全表掃描最大的問題就是目標
sql的執行時間不穩定,不可控,這個執行時間一定會隨着目標表數據量的遞增而遞增。
ROWID掃描
ROWID掃描是指oralce在訪問目標表裏的數據時,直接通過數據所在的ROWID去定位訪問這些數據。
訪問索引的方法(泛指BTREE索引)
索引唯一性掃描
索引範圍掃描
索引全表掃描
索引快速全表掃描
索引跳躍式掃描
表連接的方法
表連接就是指多個表之間使用連接條件連接在一起,使用表連接的目標sql的目的就是從多個表獲取存儲在這些表中不同維度的數據。
當優化器解析含表連接的sql時,它處理會根據目標sql文本的寫法來決定表連接的類型之外,還必須決定:1)表連接順序, 2)表連接方法 3)訪問單表的方法
表連接類型;內連接 和 外連接
表連接的方法
排序合併連接 sort merge join
嵌套循環連接 nested loops join
哈希連接 hash join
笛卡爾連接cross join
反連接 anti join
辦理按揭 semi join
星型連接 star join