openGauss 3.1.0的新型選擇率模型大解密
選擇率估算作為代價(jià)模型行數(shù)估算的基礎(chǔ),其準(zhǔn)確性影響著優(yōu)化器查詢計(jì)劃的選取,數(shù)據(jù)庫(kù)優(yōu)化器生成的不同查詢計(jì)劃之間可以達(dá)到數(shù)個(gè)數(shù)量級(jí)的區(qū)別。
一、當(dāng)前經(jīng)典數(shù)據(jù)庫(kù)優(yōu)化器對(duì)于等值查詢估計(jì)的缺點(diǎn)
例如,目前形如a = 1的等值謂詞選擇率估算可以有以下幾種方法:
1?利用統(tǒng)計(jì)信息估算:
對(duì)查詢語(yǔ)句中的等值條件,可分為MCV值和非MCV值進(jìn)行估算:
對(duì)MCV值,使用MCV對(duì)應(yīng)的頻率統(tǒng)計(jì)信息作為選擇率;
對(duì)非MCV值,使用如下經(jīng)驗(yàn)公式:

直接對(duì)所有值做均勻假設(shè),不考慮MCV:

2?在線計(jì)算:
使用Count-Mean-Min Sketch等頻率估算方法,在線計(jì)算每個(gè)常量值的選擇率。
在上述方法中,方法1對(duì)全部或者部分?jǐn)?shù)據(jù)做均勻分布假設(shè),計(jì)算量小,優(yōu)化器負(fù)擔(dān)輕,但估算粗略,對(duì)大多數(shù)常量選擇率估值不準(zhǔn)確;方法2對(duì)每個(gè)常量值都進(jìn)行單獨(dú)的計(jì)算,計(jì)算結(jié)果較為準(zhǔn)確,但是優(yōu)化器的計(jì)算負(fù)擔(dān)大,將對(duì)性能產(chǎn)生影響。
二、openGauss的新型選擇率模型
基于上述經(jīng)典優(yōu)化器的缺點(diǎn),在該版本的openGauss數(shù)據(jù)庫(kù)中,我們通過(guò)調(diào)整等值謂詞選擇率的估算方法,構(gòu)造出openGauss的新型選擇率模型,可以在兼顧準(zhǔn)確率與計(jì)算量的前提下,進(jìn)行選擇率的估計(jì)。該模型原理如下:
對(duì)MCV值,使用MCV對(duì)應(yīng)的頻率統(tǒng)計(jì)信息作為選擇率;
對(duì)不落入MCV也不落入直方圖的值,使用如下公式:

對(duì)落入直方圖的值
桶左右邊界相等,使用桶的數(shù)量估算常量選擇率:

桶左右邊界不等,使用插值方法,估算常量選擇率:

新型選擇率模型平衡計(jì)算量與準(zhǔn)確性,充分考慮數(shù)據(jù)分布情況,通過(guò)輕量的計(jì)算,能夠使得優(yōu)化器生成更優(yōu)的執(zhí)行計(jì)劃,該特性可通過(guò)GUC參數(shù)var_eq_const_selectivity控制。
三、使用示例
假設(shè)在數(shù)據(jù)庫(kù)中表t1由2列組成,分別為列a和列b,其類型均為整型(INT)。向其插入數(shù)據(jù),a值為101的數(shù)據(jù)共有300行,a值為1到100的數(shù)據(jù)各有100行,a值為150的數(shù)據(jù)150,000行,a值為200的數(shù)據(jù)有1行。則表t1由數(shù)據(jù)庫(kù)得到的統(tǒng)計(jì)信息可如下:

當(dāng)查詢語(yǔ)句為SELECT * FROM t1 WHERE a = 101;?時(shí),可知a落入直方圖桶[101,101)中,且與當(dāng)前桶左右邊界相同的桶的總個(gè)數(shù)為2,則a的選擇率為(1 – 0 – 0. 9369) / 100 * 2 = 3.9816e-7。
當(dāng)查詢?yōu)镾ELECT * FROM t1 WHERE a = 11;時(shí),可知a落入直方圖桶[11,12)中,該桶在均勻假設(shè)的前提下,分配到的distinct值數(shù)量為103 / (101 - 1) * (12 – 11) ,則a的選擇率為(1 – 0 – 0. 9369) / 100 /(103 / (101 - 1) * (12 – 11) ) = 6.1262e-4。
當(dāng)查詢?yōu)镾ELECT * FROM t1 WHERE a = 200;時(shí),常量值200沒有落入MCV,也沒有落入直方圖的任何一個(gè)桶中,則利用t1的總行數(shù)160301來(lái)預(yù)估其選擇率,則a的選擇率為1 / 160301 = 6.2383e-6。
從上面的示例可以看出,使用新型選擇率模型,充分考慮了不同常量值的選擇率,其選擇率估算能夠更加貼近實(shí)際值。此外,openGauss還會(huì)在數(shù)據(jù)庫(kù)的查詢優(yōu)化領(lǐng)域進(jìn)一步努力,構(gòu)造業(yè)內(nèi)頂尖的數(shù)據(jù)庫(kù)查詢優(yōu)化能力。