openGauss都做了哪些運算元最佳化工作?

小侃資料庫發表於2023-04-13

openGauss在程式碼裡面實現了大量的運算元級最佳化工作,為了更進一步便於使用者理解,我們對這些工作進行了總結,並且對內部具體的一些演算法進行詳細介紹,其總結如下。

【索引掃描運算元最佳化】

對索引掃描運算元進行了一定程度的重構與最佳化,以提升運算元效能。最佳化主要包括以下幾個方面:

1. 識別到程式中存在影響效能的噪點,對其進行遮蔽;

2. 在現有執行流程下,為多數場景下的高頻操作建立fast-path,以提高執行效率;

3. 對一些資料結構與演算法的實現進行了最佳化重構,以提升效能。最終經過測試,IndexScan運算元效能提升10%,IndexOnlyScan運算元效能提升30%。

【函式依賴】

函式依賴,是多列統計資訊的一種,可以描述屬性之間的關聯關係,其主要用途是提高選擇率估算的準確性。在引用函式依賴特性之前,資料庫會使用條件獨立假設的方法來估算選擇率。舉一個生活中的例子,在一個班級中,男女生的比例是1:1,喜歡瑜伽的人數佔比為20%,身高175cm以下的人數佔比為50%。我們可以說喜歡瑜伽且身高在175cm以下的女生的佔比為50% * 20% * 50% = 5%嗎?顯然這個計算結果會比實際結果略低,因為這幾個屬性之間有關聯關係,喜歡瑜伽的人中女生佔多數,女生的身高較男生普遍偏低。函式依賴特性就是用於解決此類問題,在典型場景下對於高頻資料的查詢,選擇率提升20%;對於中頻資料的查詢,選擇率提升10倍;對於典型場景,選擇率提升70倍。

【AGG函式共享轉移狀態】

AGG函式的執行分為3個階段:初始化轉移狀態、執行transition函式、執行final函式。AGG函式共享轉移狀態特性目的在於調整轉移狀態和transition函式,實現資源共享。例如執行"SELECT avg(a), sum(a) FROM t;",此時的轉移狀態初始化後為兩個引數(total, count),然後遍歷表的所有元組,total執行累加操作,count執行自增操作,最後把total/count和total分別作為avg函式和sum函式的返回結果。經驗證,SQL語句"SELECT avg(a), sum(a) FROM t;"的總耗時縮短48%左右。對其他可以共享轉移狀態的AGG函式,也可以實現不同程度的效能提升。

【Parser最佳化】

最佳化Parser階段中關鍵字檢查模組,將關鍵字查詢演算法由原來的二分查詢演算法最佳化為雜湊查詢演算法,同時最佳化關鍵字記憶體資料結構,cache訪問更友好,最佳化後Parser階段的效能提升10%。

【新型選擇率模型】

新型選擇率模型充分利用基於直方圖的統計資訊,平衡計算量與準確性,充分考慮資料分佈情況,透過輕量的計算,提高對低頻值的估算準確率,能夠使得最佳化器生成更優的執行計劃,進而提高查詢效率。

【通訊最佳化】

提升通訊整體效能,調整通訊邏輯,預設使用非阻塞通訊方式,當需要阻塞通訊語義時,利用latch輕量鎖機制,降低通訊階段耗時。輕量通訊方式的開啟與否透過POSTMASTER級別的GUC引數light_comm控制,當light_comm的值為ON / TRUE時,將開啟輕量通訊。

【表示式展平化】

基於非遞迴、操作碼方式實現資料庫中表示式計算,致力於透過展平化表示式資訊減少計算過程中堆疊使用、函式呼叫等開銷,提升語句的執行效能。

後續,openGauss還會持續對基礎運算元進行最佳化,不斷完善openGauss社群競爭力。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70023856/viewspace-2945391/,如需轉載,請註明出處,否則將追究法律責任。

相關文章