SQL优化器-RBO与CBO分别是什么
數(shù)據(jù)庫系統(tǒng)發(fā)展歷史
數(shù)據(jù)庫系統(tǒng)產(chǎn)生于20世紀(jì)60年代中期,至今有近50多年的歷史,其發(fā)展經(jīng)歷了三代演變,造就了四位圖靈獎得主,發(fā)展成為一門計算機基礎(chǔ)學(xué)科,帶動了一個巨大的軟件產(chǎn)業(yè)。
數(shù)據(jù)庫系統(tǒng)是操作系統(tǒng)之上最重要的基礎(chǔ)設(shè)施之一,被稱為軟件產(chǎn)業(yè)的常青樹,特別是它所支撐起來的大數(shù)據(jù)、人工智能應(yīng)用,更是發(fā)展迅猛。
面對發(fā)展快速的數(shù)據(jù)庫領(lǐng)域,以及人類所擁有的數(shù)據(jù)量爆發(fā)式增長,如何對海量數(shù)據(jù)進行管理、分析、挖掘便變得尤為重要。SQL優(yōu)化器正是為了解決以上問題而誕生的。
查詢優(yōu)化器簡介
SQL優(yōu)化器,其中最重要的一個組件是查詢優(yōu)化器,是數(shù)據(jù)庫系統(tǒng)的重要組成部分。特別是對于現(xiàn)代大數(shù)據(jù)系統(tǒng),執(zhí)行計劃的搜索空間異常龐大,研究人員研究了許多方法對執(zhí)行計劃空間進行裁剪,以減少搜索空間的代價。
在當(dāng)今數(shù)據(jù)庫系統(tǒng)領(lǐng)域,查詢優(yōu)化器可以說是必備組件,不管是關(guān)系型數(shù)據(jù)庫系統(tǒng)Oracle、MySQL,流處理領(lǐng)域的Flink、Storm,批處理領(lǐng)域的Hive、Spark SQL,還是文本搜索領(lǐng)域的Elasticsearch等,都會內(nèi)嵌一個查詢優(yōu)化器。
有的數(shù)據(jù)庫系統(tǒng)會采用自研的優(yōu)化器,而有的則會采用開源的查詢優(yōu)化器插件,比如Apache Calcite就是一個優(yōu)秀的開源查詢優(yōu)化器插件。而像Oracle數(shù)據(jù)庫的查詢優(yōu)化器,則是Oracle公司自研的一個核心組件,負責(zé)解析SQL,其目的是按照一定的原則來獲取目標(biāo)SQL在當(dāng)前情形下執(zhí)行的最高效執(zhí)行路徑。
這里拓展一下,關(guān)于查詢優(yōu)化器所要解決的核心問題:具有多個連接操作的復(fù)雜查詢優(yōu)化。不少學(xué)者相繼提出了基于左線性樹的查詢優(yōu)化算法、基于右線性樹的查詢優(yōu)化算法、基于片段式右線性樹的查詢優(yōu)化算法、基于濃密樹的查詢優(yōu)化算法、基于操作森林的查詢優(yōu)化算法等。這些算法在搜索代價和最終獲得的查詢計劃的效率之間有著不同的權(quán)衡。
總的來說,查詢優(yōu)化器在很大程度上決定了一個數(shù)據(jù)庫系統(tǒng)的性能,優(yōu)化器的作用就好比找到兩點之間的最短路徑。
RBO(Rule-Based Optimization)
RBO: Rule-Based Optimization也即“基于規(guī)則的優(yōu)化器”,該優(yōu)化器按照硬編碼在數(shù)據(jù)庫中的一系列規(guī)則來決定SQL的執(zhí)行計劃。
以O(shè)racle數(shù)據(jù)庫為例,RBO根據(jù)Oracle指定的優(yōu)先順序規(guī)則,對指定的表進行執(zhí)行計劃的選擇。比如在規(guī)則中:索引的優(yōu)先級大于全表掃描。
通過Oracle的這個例子我們可以感受到,在RBO中,有著一套嚴(yán)格的使用規(guī)則,只要你按照規(guī)則去寫SQL語句,無論數(shù)據(jù)表中的內(nèi)容怎樣,也不會影響到你的“執(zhí)行計劃”,也就是說RBO對數(shù)據(jù)不“敏感”。這就要求開發(fā)人員非常了解RBO的各項細則,不熟悉規(guī)則的開發(fā)人員寫出來的SQL性能可能非常差。
但在實際的過程中,數(shù)據(jù)的量級會嚴(yán)重影響同樣SQL的性能,這也是RBO的缺陷所在。畢竟規(guī)則是死的,數(shù)據(jù)是變化的,所以RBO生成的執(zhí)行計劃往往是不可靠的,不是最優(yōu)的。
CBO(Cost-Based Optimization)
CBO: Cost-Based Optimization也即“基于代價的優(yōu)化器”,該優(yōu)化器通過根據(jù)優(yōu)化規(guī)則對關(guān)系表達式進行轉(zhuǎn)換,生成多個執(zhí)行計劃,然后CBO會通過根據(jù)統(tǒng)計信息(Statistics)和代價模型(Cost Model)計算各種可能“執(zhí)行計劃”的“代價”,即COST,從中選用COST最低的執(zhí)行方案,作為實際運行方案。
CBO依賴數(shù)據(jù)庫對象的統(tǒng)計信息,統(tǒng)計信息的準(zhǔn)確與否會影響CBO做出最優(yōu)的選擇。
以O(shè)racle數(shù)據(jù)庫為例,統(tǒng)計信息包括SQL執(zhí)行路徑的I/O、網(wǎng)絡(luò)資源、CPU的使用情況。
目前各大數(shù)據(jù)庫和大數(shù)據(jù)計算引擎都傾向于使用CBO,例如從Oracle 10g開始,Oracle已經(jīng)徹底放棄RBO,轉(zhuǎn)而使用CBO;而Hive在0.14版本中也引入了CBO。
參考文獻
[1] 《數(shù)據(jù)庫系統(tǒng)導(dǎo)論》(第5版) 王珊,薩師煊
[2] Oracle SQL優(yōu)化器簡介[https://www.cnblogs.com/mzq123/p/10398701.html]
[3] SQL優(yōu)化器簡介[https://www.cnblogs.com/jixin/p/10500096.html]
[4] 深入淺出Calcite與SQL CBO(Cost-Based Optimizer)優(yōu)化[https://www.cnblogs.com/listenfwind/p/13192259.html]
[5] SQL優(yōu)化器原理——查詢優(yōu)化器綜述[https://zhuanlan.zhihu.com/p/40478975]
總結(jié)
以上是生活随笔為你收集整理的SQL优化器-RBO与CBO分别是什么的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式(六)------设计模式六大原
- 下一篇: PHP后台代码解决跨域问题