RBO和CBO是兩種數據庫引擎在執行sql語句時的優化策略。
什么是基於規則的優化(Rule Based Optimizer)?
這是一種比較老的技術,簡單說基於規則的優化就是當數據庫執行一條query語句的時候必須遵循預先定義好的一系列規則(比如oracle的15條規則,排名越靠前的執行引擎認為效率越高
https://docs.oracle.com/cd/B10501_01/server.920/a96533/rbo.htm#38960)來確定執行過程,它不關心訪問表的數據分布情況,僅僅憑借規則經驗來確定,所以說是一種比較粗放的優化策略。
例如:如果查詢表存在可以利用的索引(index),RBO總是會優先選擇索引來掃描數據,這通常是比較簡單但可能並不是最好的策略。
比如說,一張員工表的性別這一列存在索引,有男員工95名,女員工5名,如果執行如下sql語句:SELECT * FROM emp WHERE gender = 'MALE'; 顯然選擇索引來查詢的話性能相比普通的全表掃描后過濾會差。
什么是基於代價的優化(Cost Based Optimizer)?
基於代價的優化的產生就是為了解決上面RBO的弊端,讓執行引擎依據預先存儲到數據庫中表的一些實時更新的統計信息來選擇出最優代價最小的執行計划來執行query語句,CBO會根據統計信息來生成一組可能被使用到的執行計划,進而估算出每個計划的代價,從而選擇出代價最小的交給執行器去執行,其中表的統計信息一般會有表大小,行數,單行長度,單列數據分布情況,索引情況等等。
總結:
基於規則的優化器更像是一個經驗豐富熟知各條路段的老司機,大部分情況可以根據自己的經驗來判斷走哪條路可以更快的到達目的地,而基於代價的優化更像手機里面的地圖,它可以選擇出許多不同的路徑根據實時的路況信息綜合考慮路程長度,交通狀況來挑出最優的路徑。