openGauss —— 智能優(yōu)化器之基數(shù)估計
現(xiàn)代數(shù)據(jù)庫優(yōu)化器主要依賴于其內(nèi)部的代價估計系統(tǒng),而代價估計最重要的依據(jù)就是查詢算子的基數(shù),即數(shù)據(jù)通過算子內(nèi)查詢條件過濾之后剩余的結(jié)果行數(shù)。因此基數(shù)估計技術(shù)是影響優(yōu)化器產(chǎn)生的執(zhí)行計劃性能最關(guān)鍵的技術(shù)。學(xué)術(shù)界和工業(yè)界針對基數(shù)估計技術(shù)研究和發(fā)展了幾十年,但是由于基數(shù)估計需要兼顧準(zhǔn)確性和效率,到目前為止其依然是數(shù)據(jù)庫中最難解決的課題之一,被稱為是優(yōu)化器的“Achilles heel”。
當(dāng)前數(shù)據(jù)庫為了高效估計多列復(fù)合查詢條件的基數(shù),廣泛采用了基于獨立性假設(shè)的多列數(shù)據(jù)分布刻畫的技術(shù),比如假設(shè)X,Y,Z列的聯(lián)合分布為P(X,Y,Z)=P(X)P(Y)P(Z)。這種方式可以估計出多列查詢基數(shù)的下界,但是往往會嚴(yán)重偏離真實的基數(shù),導(dǎo)致優(yōu)化器無法選中正確的執(zhí)行計劃。針對這個問題,數(shù)據(jù)庫領(lǐng)域提出過很多多維數(shù)據(jù)的分布刻畫技術(shù),比如多列直方圖,神經(jīng)網(wǎng)絡(luò)建模等技術(shù),但在實際落地中遇到很大的性能方面的挑戰(zhàn)。
openGauss本次開源的智能基數(shù)估計特性采用了一種分布自適應(yīng)的內(nèi)核原生多列數(shù)據(jù)分布刻畫方法,其首先利用數(shù)據(jù)列相關(guān)性進(jìn)行數(shù)據(jù)分布感知,然后根據(jù)分布構(gòu)建對應(yīng)的概率圖模型。
具體來說,圖模型中的每個節(jié)點都是一列數(shù)據(jù),節(jié)點之間的邊表示節(jié)點之間的相關(guān)關(guān)系。對于相關(guān)性不強(qiáng)的數(shù)據(jù)列,在圖模型中也是獨立且不相關(guān)的,此時的基數(shù)估計等價于利用獨立性假設(shè)進(jìn)行估計;而如果識別出列之前有強(qiáng)相關(guān)性(即一列數(shù)據(jù)的取值分布依賴于另一列),那么圖模型會綜合考慮兩列的聯(lián)合分布;而對于更多列的聯(lián)合分布,為了避免指數(shù)級別的空間復(fù)雜度增長,openGauss采用了條件獨立性假設(shè),比如三列數(shù)據(jù)X,Y,Z分布相關(guān),但是一旦將Y取值固定,X和Y的分布便稱為獨立,這時的聯(lián)合概率計算可以被抽象為P(X,Y,Z)=P(X|Y)P(Y|Z)P(Z)。

openGauss針對單列數(shù)據(jù)不同值個數(shù)多的場景對模型進(jìn)行了進(jìn)一步的優(yōu)化,具體優(yōu)化點有四個:
(1)針對連續(xù)浮點型值進(jìn)行等寬分桶為直方圖;
(2)針對符合近似Zipf分布的離散值將低頻值合并;
(3)采用NDV近似估計技術(shù)對于采樣稀疏帶來的偏差進(jìn)行糾正;
(4)使用正態(tài)分布對桶內(nèi)條件分布進(jìn)行參數(shù)化建模。
openGauss利用此方法顯著提升了多列復(fù)合索引的選擇準(zhǔn)確率,實現(xiàn)30%以上的端到端的性能提升,實現(xiàn)了兼顧計算性能和估計準(zhǔn)確率的基數(shù)估計。
該特性是openGauss對數(shù)據(jù)庫內(nèi)核優(yōu)化器做的大幅度改動,也是直接利用AI技術(shù)改造經(jīng)典數(shù)據(jù)庫架構(gòu)的創(chuàng)新嘗試,經(jīng)過實踐驗證可以解決傳統(tǒng)優(yōu)化器架構(gòu)無法解決的疑難場景,大幅度提高數(shù)據(jù)庫查詢性能。用戶可以通過下載最新的openGauss數(shù)據(jù)庫版本進(jìn)行體驗。