誰是最強(qiáng)六邊形戰(zhàn)士(集中式SQL完結(jié)篇)
原創(chuàng)近期針對(duì)國產(chǎn)集中式數(shù)據(jù)庫的SQL能力,做了些評(píng)測工作,也分多期進(jìn)行了分享。本篇是對(duì)之前輸出內(nèi)容的一個(gè)總結(jié)。其實(shí)SQL能力包含的范圍很廣,還有許多未測試的部分。受限于個(gè)人精力,先早告一段落做個(gè)總結(jié)。這個(gè)特別聲明下,因國產(chǎn)數(shù)據(jù)庫的發(fā)展很快,上述測試內(nèi)容代表某一版本能力,僅供用戶選型時(shí)作為參考。之前也有廠商聯(lián)系我,在最新版本中有了很大增強(qiáng),后續(xù)我將在這個(gè)平臺(tái)更新廠商的最新功能改進(jìn)。
1. SQL能力評(píng)測整體表現(xiàn)
(1)測試方案回顧
在展開說明之前,先回顧下整體測試方案。
? 評(píng)測對(duì)象架構(gòu):集中式
從數(shù)據(jù)庫架構(gòu)上看,考慮到分布式與集中式的差異較大,本次將重點(diǎn)放在集中式數(shù)據(jù)庫上。從之前接觸用戶到第三方調(diào)查機(jī)構(gòu)的報(bào)告來看,數(shù)據(jù)庫的集中式架構(gòu)仍然是主流架構(gòu),占據(jù)近八成左右的市場份額。因此選擇以集中式數(shù)據(jù)庫為評(píng)測對(duì)象。
? 評(píng)測功能標(biāo)準(zhǔn):Oracle
長期以來,Oracle 數(shù)據(jù)庫一直是數(shù)據(jù)庫業(yè)內(nèi)的標(biāo)桿性產(chǎn)品,特別是在集中式數(shù)據(jù)庫領(lǐng)域。因此,本次測試會(huì)以O(shè)racle 的能力為標(biāo)準(zhǔn)與國內(nèi)數(shù)據(jù)庫進(jìn)行對(duì)比。此外,考慮到國內(nèi)大部分已有業(yè)務(wù)也都是基于 Oracle 去開發(fā)的,因此遷移到國產(chǎn)數(shù)據(jù)庫采用與Oracle為參照物也具有很好的參考意義。
? 評(píng)測產(chǎn)品范圍:主流+代表性
國內(nèi)數(shù)據(jù)庫廠商及產(chǎn)品非常多,選擇哪些廠商及產(chǎn)品是個(gè)很頭疼的事情。這里本著主流或有代表性的原則進(jìn)行選擇。從現(xiàn)有集中式數(shù)據(jù)庫的市場占有率方面,選擇頭部的廠商達(dá)夢(mèng)、電科金倉為代表。從生態(tài)方面選擇 openGauss 生態(tài)的海量數(shù)據(jù);MySQL生態(tài)上沒有太好選擇,故使用最新社區(qū)版本;PG 生態(tài)上由之前的電科金倉來代表。自研方面,則采用的崖山數(shù)據(jù)庫,畢竟其主打也是Oracle的兼容能力。最后也選擇 Oracle 在國內(nèi)仍然大規(guī)模使用的版本作為參照對(duì)象。
? 評(píng)測版本&配置
采用官方Docker鏡像,在未做優(yōu)化下進(jìn)行測試。具體版本如下
(2)測試結(jié)果概覽
基于之前的測試結(jié)果,將整體各個(gè)數(shù)據(jù)庫的支持能力從1~5分進(jìn)行打分后,整理為如下表格。
從上述這個(gè)表格里,可對(duì)各個(gè)數(shù)據(jù)庫對(duì)SQL支持能力有個(gè)全面的了解。為更清晰的表現(xiàn)出數(shù)據(jù)庫的綜合能力,我通過下面的雷達(dá)圖更為清晰地表達(dá)下。
Oracle,作為對(duì)標(biāo)對(duì)象,其整體表現(xiàn)是最為全面的,也是其他數(shù)據(jù)庫的標(biāo)桿。MySQL,作為最流行的開源數(shù)據(jù)庫,在很多互聯(lián)網(wǎng)類應(yīng)用上得到大量使用,但在更能反映其企業(yè)級(jí)應(yīng)用支持的SQL能力上,表現(xiàn)差強(qiáng)人意。特別是在關(guān)聯(lián)、排序、視圖和邏輯優(yōu)化等方面,都存在較為明顯的短板。DM,則作為老牌國產(chǎn)數(shù)據(jù)庫廠商,各方面能力表現(xiàn)比較全面,這也是達(dá)夢(mèng)在國內(nèi)替換 Oracle 等方面表現(xiàn)出色的原因之一。KingBase和Vastbase,情況比較類似,前者是基于PG、后者是基于openGauss做了大量優(yōu)化的產(chǎn)品,在基礎(chǔ)能力上表現(xiàn)也都非常出色。YashanDB,作為數(shù)據(jù)庫領(lǐng)域的后來者,近些年發(fā)展迅速,其整體評(píng)測下來的表現(xiàn)很驚艷;特別是其使用體感(如執(zhí)行計(jì)劃)幾乎與Oracle無異,這點(diǎn)很贊!總體來看,國產(chǎn)數(shù)據(jù)庫的綜合表現(xiàn)都是不錯(cuò)的,可以承擔(dān)起企業(yè)核心業(yè)務(wù)場景,在具體細(xì)分方面還各有不足,需要在未來長期補(bǔ)強(qiáng)。值得欣慰的是,這方面國產(chǎn)數(shù)據(jù)庫也都看到了自己的短板,正在快速追趕中...
2. SQL能力評(píng)測分項(xiàng)說明
(1)訪問路徑
訪問路徑,主要看數(shù)據(jù)庫通過表或索引訪問數(shù)據(jù)時(shí),支持的訪問方式。更多、更豐富的訪問方式,代表可能采取更為高效的方式來訪問數(shù)據(jù)。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)差異較大,特別是針對(duì)索引的訪問方式。
(2)表連接
針對(duì)表連接的情況,主要是看數(shù)據(jù)庫采用何種執(zhí)行計(jì)劃來完成。在在同樣架構(gòu)、同等數(shù)據(jù)規(guī)模,都收集統(tǒng)計(jì)信息的情況下,不同數(shù)據(jù)庫在選擇嵌套循環(huán)、排序合并還是哈希關(guān)聯(lián)上,效率還是差異挺大的。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)差異不大,針對(duì)三種關(guān)聯(lián)方式大多支持,但在具體的選擇使用上,還是存在不同。
(3)子查詢
? 子查詢支持情況
子查詢根據(jù)其所處位置、與主查詢關(guān)系、結(jié)果集形式及含有謂詞情況,分為多種類型??疾煲粋€(gè)要點(diǎn),就是數(shù)據(jù)庫對(duì)上述子查詢不同種類的支持情況。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫都已支持。
? 子查詢優(yōu)化
子查詢有多種優(yōu)化方式,包括子查詢展開、子查詢合并、子查詢推入、謂詞遷移等。其核心目的:一是盡量不使用子查詢,將其與外側(cè)查詢一起處理,這樣更優(yōu);二是如果不能展開,則將更多的條件能放入子查詢內(nèi)執(zhí)行,盡早減少數(shù)據(jù)規(guī)模,達(dá)到優(yōu)化目的。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)尚待提高,針對(duì)包含多層嵌套的子查詢,表現(xiàn)較Oracle差距還是很大。
(4)排序與分組聚合
? 排序
排序,是數(shù)據(jù)庫內(nèi)比較消耗資源的一類操作,特別是在結(jié)果比較大的情況下。因此在數(shù)據(jù)庫處理上,應(yīng)盡量規(guī)避排序的行為。在上面這些操作中,有些是為了進(jìn)行排序,有些是為了其他目的(如去重等);因此數(shù)據(jù)庫是可以考慮優(yōu)化此類排序行為的。例如Oracle數(shù)據(jù)庫,在10g以前的版本是通過SORT GROUP BY完成分組的,但在10g之后默認(rèn)提供了HASH GROUP BY,這樣效率更高,當(dāng)然其結(jié)果集不保證有序了。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)差異較大,針對(duì)不同排序需求,所能采取的優(yōu)化手段在選擇上存在差異。
? 分組聚合
數(shù)據(jù)庫中的分組聚合是兩類操作:分組操作是指用SQL語句將一個(gè)結(jié)果集分為若干組,并對(duì)這樣每一組進(jìn)行聚合計(jì)算;聚合操作則是基于多行記錄返回?cái)?shù)據(jù)數(shù)據(jù):平均、最大、最小值等,聚合操作必須處理輸入數(shù)據(jù)的每一行記錄,因此通常和全表掃描聯(lián)系在一起。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫大多已支持。
(5)視圖
? 視圖優(yōu)化
視圖優(yōu)化,是指針對(duì)語句中存在視圖的情況采取的優(yōu)化手段,包括有視圖合并、條件推入、視圖重寫等情況。視圖合并,是指對(duì)于存在復(fù)雜視圖的查詢,優(yōu)化器可以有兩種方式來優(yōu)化查詢。一是創(chuàng)建一個(gè)用于聚集視圖合并結(jié)果集,并把這個(gè)結(jié)果集連接到基表中;另一個(gè)是展開視圖連接兩個(gè)基表并聚集這些連接。條件推入,則是指在無法執(zhí)行視圖合并的情況下,將讀取查詢中的查詢條件推入到視圖查詢中去。視圖重寫,則是將對(duì)視圖的引用重寫為對(duì)基本表的引用。視圖重寫后的SQL多被子查詢進(jìn)行進(jìn)一步優(yōu)化。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)差異不大,針對(duì)視圖合并類的優(yōu)化還有較大差距。
(6)邏輯優(yōu)化
? 謂詞改寫
謂詞重寫,又稱為等價(jià)謂詞重寫,是指將原執(zhí)行效率低的謂詞改寫為效率高的謂詞并重寫SQL,從而提高SQL的整體執(zhí)行效率的一種優(yōu)化手段。其本質(zhì)是在于不同謂詞的處理效率存在差異所導(dǎo)致。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)參差不齊,主要看內(nèi)部處理效率,改寫倒不一定效率就很高。
? 條件化簡
條件化簡,是指將語句中的條件子句部分優(yōu)化,選擇執(zhí)行代價(jià)更小或更容易利用到索引、約束等的情況。條件子句優(yōu)化的本質(zhì)是:盡早推知運(yùn)算的結(jié)果以有利于對(duì)元組數(shù)進(jìn)行計(jì)算,使得根據(jù)代價(jià)估算模型(元組數(shù)是重要的計(jì)算依據(jù))可以準(zhǔn)確地推演出最優(yōu)查詢執(zhí)行計(jì)劃。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)差異較大,針對(duì)可能的化簡條件很多還未支持。
? 連接消除
在多表連接的過程中,查詢優(yōu)化器可以找出多表連接的最優(yōu)查詢執(zhí)行計(jì)劃,這意味著多個(gè)表的最優(yōu)的連接次序被確定。如果根據(jù)表的連接次序確定析取條件的優(yōu)先判斷次序,存在加速判斷的可能(處于表達(dá)式后面的條件可能不用判斷了)。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)差異較大,有些消除方式還不支持。
? 索引優(yōu)化
如果語句中不僅包含有Select(選擇)、Project(投影)、Join(連接) 三種基礎(chǔ)操作,還有其他類操作(如分組等)。此時(shí),優(yōu)化器是可以根據(jù)索引進(jìn)行一定的優(yōu)化。針對(duì)這方面,國產(chǎn)數(shù)據(jù)庫表現(xiàn)差距明顯,還有較大提升空間。