SQL優化器-RBO與CBO分別是什麼
阿新 • • 發佈:2020-12-28
## 資料庫系統發展歷史
資料庫系統產生於20世紀60年代中期,至今有近50多年的歷史,其發展經歷了三代演變,造就了四點陣圖靈獎得主,發展成為一門計算機基礎學科,帶動了一個巨大的軟體產業。
![1](https://img2020.cnblogs.com/blog/1001136/202012/1001136-20201227224139792-908796340.png)
資料庫系統是作業系統之上最重要的基礎設施之一,被稱為軟體產業的常青樹,特別是它所支撐起來的大資料、人工智慧應用,更是發展迅猛。
面對發展快速的資料庫領域,以及人類所擁有的資料量爆發式增長,如何對海量資料進行管理、分析、挖掘便變得尤為重要。SQL優化器正是為了解決以上問題而誕生的。
## 查詢優化器簡介
![2](https://img2020.cnblogs.com/blog/1001136/202012/1001136-20201227224219416-1767238585.png)
SQL優化器,其中最重要的一個元件是查詢優化器,是資料庫系統的重要組成部分。特別是對於現代大資料系統,執行計劃的搜尋空間異常龐大,研究人員研究了許多方法對執行計劃空間進行裁剪,以減少搜尋空間的代價。
在當今資料庫系統領域,查詢優化器可以說是必備元件,不管是關係型資料庫系統Oracle、MySQL,流處理領域的Flink、Storm,批處理領域的Hive、Spark SQL,還是文字搜尋領域的Elasticsearch等,都會內嵌一個查詢優化器。
有的資料庫系統會採用自研的優化器,而有的則會採用開源的查詢優化器外掛,比如` Apache Calcite `就是一個優秀的開源查詢優化器外掛。而像Oracle資料庫的查詢優化器,則是Oracle公司自研的一個核心元件,負責解析SQL,其目的是按照一定的原則來獲取目標SQL在當前情形下執行的最高效執行路徑。
這裡拓展一下,關於查詢優化器所要解決的核心問題:具有多個連線操作的複雜查詢優化。不少學者相繼提出了基於左線性樹的查詢優化演算法、基於右線性樹的查詢優化演算法、基於片段式右線性樹的查詢優化演算法、基於濃密樹的查詢優化演算法、基於操作森林的查詢優化演算法等。這些演算法在搜尋代價和最終獲得的查詢計劃的效率之間有著不同的權衡。
總的來說,查詢優化器在很大程度上決定了一個數據庫系統的效能,優化器的作用就好比找到兩點之間的最短路徑。
## RBO(Rule-Based Optimization)
` RBO: Rule-Based Optimization `也即“基於規則的優化器”,該優化器按照硬編碼在資料庫中的一系列規則來決定SQL的執行計劃。
以Oracle資料庫為例,RBO根據Oracle指定的優先順序規則,對指定的表進行執行計劃的選擇。比如在規則中:索引的優先順序大於全表掃描。
通過Oracle的這個例子我們可以感受到,在RBO中,有著一套嚴格的使用規則,只要你按照規則去寫SQL語句,無論資料表中的內容怎樣,也不會影響到你的“執行計劃”,也就是說RBO對資料不“敏感”。這就要求開發人員非常瞭解RBO的各項細則,不熟悉規則的開發人員寫出來的SQL效能可能非常差。
但在實際的過程中,資料的量級會嚴重影響同樣SQL的效能,這也是RBO的缺陷所在。畢竟規則是死的,資料是變化的,所以RBO生成的執行計劃往往是不可靠的,不是最優的。
## CBO(Cost-Based Optimization)
` CBO: Cost-Based Optimization `也即“基於代價的優化器”,該優化器通過根據優化規則對關係表示式進行轉換,生成多個執行計劃,然後CBO會通過根據統計資訊(Statistics)和代價模型(Cost Model)計算各種可能“執行計劃”的“代價”,即COST,從中選用COST最低的執行方案,作為實際執行方案。
CBO依賴資料庫物件的統計資訊,統計資訊的準確與否會影響CBO做出最優的選擇。
以Oracle資料庫為例,統計資訊包括SQL執行路徑的I/O、網路資源、CPU的使用情況。
目前各大資料庫和大資料計算引擎都傾向於使用CBO,例如從Oracle 10g開始,Oracle已經徹底放棄RBO,轉而使用CBO;而Hive在0.14版本中也引入了CBO。
## 參考文獻
[1] 《資料庫系統導論》(第5版) 王珊,薩師煊
[2] Oracle SQL優化器簡介[https://www.cnblogs.com/mzq123/p/10398701.html]
[3] SQL優化器簡介[https://www.cnblogs.com/jixin/p/10500096.html]
[4] 深入淺出Calcite與SQL CBO(Cost-Based Optimizer)優化[https://www.cnblogs.com/listenfwind/p/13192259.html]
[5] SQL優化器原理——查詢優化器綜述[https://zhuanlan.zhihu.com/p/4