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