openGauss數據庫核心技術(shù)
??
openGauss:The Core Technologies
華為公司從開(kāi)始自研數據庫至今已經(jīng)有近20年歷史,在去年6月30日,華為正式宣布開(kāi)源數據庫能力,開(kāi)放openGauss數據庫源代碼,并成立openGauss開(kāi)源社區,社區官網(wǎng)同步上線(xiàn)。從開(kāi)源至今的短短不到一年半的時(shí)間,openGauss的版本在不斷的進(jìn)行迭代升級,如今已更新至2.1.0版本。
據上半年統計報告顯示,openGauss社區官方網(wǎng)站訪(fǎng)問(wèn)量78萬(wàn)+;官方網(wǎng)站訪(fǎng)客人數7萬(wàn)+;官方網(wǎng)站安裝包下載量16萬(wàn)+,下載遍及全球49個(gè)國家328個(gè)城市;社區開(kāi)發(fā)者人數1200+;社區累計需求代碼PR提交數達到2600+,累計Commit數達到4500+。
越來(lái)越多的企業(yè)簽署社區CLA,參與社區代碼貢獻。并且,其中有6家合作伙伴發(fā)布基于openGauss的商業(yè)發(fā)行版,例如云和恩墨基于openGauss商業(yè)發(fā)行版“MogDB”就已經(jīng)落地郵儲銀行、民生銀行。
此外,openGauss的熱度也在不斷地攀升,在短短一年半的時(shí)間內,一躍國產(chǎn)數據庫排行榜前三的席位,倍受大家的關(guān)注。
在關(guān)注度不斷上升的情況下,為了讓大家能更好的掌握openGauss相關(guān)知識,即日起,我們將連載《openGauss數據庫核心技術(shù)》系列文章,與大家一起學(xué)習openGauss數據庫的核心技術(shù),我們將從以下幾大方面進(jìn)行更新:openGauss數據庫SQL引擎
openGauss數據庫執行器技術(shù)
openGauss存儲技術(shù)
openGauss事務(wù)機制
openGauss數據庫安全
感興趣的小伙伴記得關(guān)注我們的公眾號~
openGauss數據庫SQL引擎
數據庫的SQL引擎是數據庫重要的子系統之一,它對上負責承接應用程序發(fā)送過(guò)來(lái)的SQL語(yǔ)句,對下則負責指揮執行器運行執行計劃。其中優(yōu)化器作為SQL引擎中最重要、最復雜的模塊,被稱(chēng)為數據庫的“大腦”,優(yōu)化器產(chǎn)生的執行計劃的優(yōu)劣直接決定數據庫的性能。
SQL引擎概覽
SQL引擎是數據庫系統重要組成部分,它的主要職責是負責將應用程序輸入的SQL在當前負載場(chǎng)景下生成高效的執行計劃,在SQL的高效執行上扮演重要角色。SQL在SQL引擎里執行過(guò)程,如圖7-1所示。
圖1 SQL執行流程
從圖7-1中可以看出,應用程序的SQL需要經(jīng)過(guò)SQL解析生成邏輯執行計劃、經(jīng)過(guò)查詢(xún)優(yōu)化生成物理執行計劃,然后將物理執行計劃轉交給查詢(xún)執行引擎做物理算子的執行操作。
SQL解析通常包含詞法分析、語(yǔ)法分析、語(yǔ)義分析幾個(gè)子模塊。SQL語(yǔ)言是介于關(guān)系演算和關(guān)系代數之間一種描述性語(yǔ)言,它吸取了關(guān)系代數中一部分邏輯算子的描述,而放棄了關(guān)系代數中“過(guò)程化”的部分,SQL解析主要的作用就是將一個(gè)SQL語(yǔ)句編譯成為一個(gè)由關(guān)系算子組成的邏輯執行計劃。
描述語(yǔ)言的特點(diǎn)是規定了需要獲取的“WHAT”,而不關(guān)心“HOW”,也就是只關(guān)注結果而不關(guān)注過(guò)程,因此SQL語(yǔ)言描述性的特點(diǎn)導致查詢(xún)優(yōu)化在數據庫管理系統中具有非常重要的作用。
查詢(xún)重寫(xiě)則是在邏輯執行計劃的基礎上進(jìn)行等價(jià)的關(guān)系代數變換,這種優(yōu)化也可以稱(chēng)為代數優(yōu)化,雖然兩個(gè)關(guān)系代數式獲得的結果完全相同,但是它們的執行代價(jià)卻可能有很大的差異,這就構成了查詢(xún)重寫(xiě)優(yōu)化的基礎。
在早期的數據庫管理系統中,通常采用基于啟發(fā)式規則的方法來(lái)生成最優(yōu)的物理執行計劃,但是這種基于規則的優(yōu)化的靈活度不夠,常常導致產(chǎn)生一些次優(yōu)的執行計劃,而代價(jià)估算的引入,則從根本上解決了基于規則優(yōu)化的不足。
基于代價(jià)的優(yōu)化器一方面生成“候選”的物理執行路徑,另一方面對這些執行路徑計算它們的執行代價(jià),這樣就建立了執行路徑的篩選標準,從而能夠通過(guò)比較代價(jià)而獲得最優(yōu)的物理執行計劃。
SQL解析
SQL語(yǔ)句在數據庫管理系統中的編譯過(guò)程符合編譯器實(shí)現的常規過(guò)程,需要進(jìn)行詞法分析、語(yǔ)法分析和語(yǔ)義分析。
§ 詞法分析:從查詢(xún)語(yǔ)句中識別出系統支持的關(guān)鍵字、標識符、操作符、終結符等,每個(gè)詞確定自己固有的詞性。
§ 語(yǔ)法分析:根據SQL語(yǔ)言的標準定義語(yǔ)法規則,使用詞法分析中產(chǎn)生的詞去匹配語(yǔ)法規則,如果一個(gè)SQL語(yǔ)句能夠匹配一個(gè)語(yǔ)法規則,則生成對應的抽象語(yǔ)法樹(shù)(Abstract Syntax Tree,AST)。
§ 語(yǔ)義分析:對語(yǔ)法樹(shù)(AST)進(jìn)行有效性檢查,檢查語(yǔ)法樹(shù)中對應的表、列、函數、表達式是否有對應的元數據,將抽象語(yǔ)法樹(shù)轉換為邏輯執行計劃(關(guān)系代數表達式)。
在SQL語(yǔ)言標準中,確定了SQL語(yǔ)言的關(guān)鍵字以及語(yǔ)法規則信息,SQL解析器在做詞法分析的過(guò)程中會(huì )將一個(gè)SQL語(yǔ)句根據關(guān)鍵字信息以及間隔信息劃分為獨立的原子單位,每個(gè)單位以一個(gè)詞的方式展現,例如有SQL語(yǔ)句:
SELECT w_name FROM warehouse WHERE w_no = 1;
可以劃分的關(guān)鍵字、標識符、操作符、常量等原子單位,如表7-1所示。
詞性
內容
關(guān)鍵字
SELECT、FROM、WHERE
標識符
w_name、warehouse、w_no
操作符
=
常量
1
表1 詞法分析的特征
語(yǔ)法分析會(huì )根據詞法分析獲得的詞來(lái)匹配語(yǔ)法規則,最終生成一個(gè)抽象語(yǔ)法樹(shù)(AST),每個(gè)詞作為語(yǔ)法樹(shù)的葉子結點(diǎn)出現,如圖7-2所示。
圖2 抽象語(yǔ)法樹(shù)
抽象語(yǔ)法樹(shù)表達的語(yǔ)義還僅僅限制在能夠保證應用的SQL語(yǔ)句符合SQL標準的規范,但是對于SQL語(yǔ)句的內在含義還需要做有效性的檢查。
§ 檢查關(guān)系的使用:FROM子句中出現的關(guān)系必須是該查詢(xún)對應模式中的關(guān)系或視圖。
§ 檢查與解析屬性的使用:在SELECT句中或者WHERE子句中出現的各個(gè)屬性必須是FROM子句中某個(gè)關(guān)系或視圖的屬性。
§ 檢查數據類(lèi)型:所有屬性的數據類(lèi)型必須是匹配的。
在有效性檢查的同時(shí),語(yǔ)義分析的過(guò)程還是有效性語(yǔ)義綁定(Bind)的過(guò)程,通過(guò)語(yǔ)義分析的檢查,抽象語(yǔ)法樹(shù)就轉換成一個(gè)邏輯執行計劃,邏輯執行計劃可以通過(guò)關(guān)系代數表達式的形式來(lái)表現,如圖7-3所示。
圖3 關(guān)系代數表達式
未完待續......