SQL優化-RBO(Rule-Based Optimization)

語言: CN / TW / HK

SQL 優化的過程可以分為邏輯優化和物理優化兩個部分。邏輯優化主要是基於規則的優化,簡稱 RBO(Rule-Based Optimization)。物理優化會為邏輯查詢計劃中的算子選擇某個具體的實現,需要用到一些統計信息,決定哪一種方式代價最低,所以是基於代價的優化 CBO(Cost-Based Optimization)。

優化器是開務數據庫中的一個核心的模塊,開務數據庫使用優化器來完成對 SQL 語句優化並得到最優的邏輯計劃,開務數據庫裏的優化器分為 RBO 和 CBO 兩個階段。

RBO 是基於規則的優化,這些規則背後的原理是關係代數的等價變換,其中典型的規則包括:列剪裁,謂詞下推等。RBO 將內置的規則作為優化的基礎,同時這些規則是硬編碼在開務數據庫的代碼中的,RBO 會根據這些規則從目標 SQL 諸多可能的代數轉換中選擇一條來作為邏輯計劃。

開務數據庫的 RBO 優化器採用了 Optgen 語言編寫,它提供了一種直觀的語法來定義、匹配和替換目標表達式樹中的節點。優化器規則的編寫便是基於這種語言,使用 Optgen 語言可以很容易實現 RBO 規則。

開務數據庫的 RBO 規則實現如下圖所示,①被稱為匹配模式,②被稱為替換模式,優化器規則是某表達式滿足①模式,然後轉化為②模式的表達式。

①的匹配模式又分為三部分,第一部分中括號內是規則的名稱,在 Opt 文件編譯時會作為規則的標識,第二部分是第二行左小括號後位規則作用域,在開務數據庫內有明確的類型劃分。編寫規則時要清楚這條規則是針對哪種類型表達式發生作用,第三部分是剩下的規則部分,是規則的匹配條件。

模式①匹配條件是等值表達式,左孩子不是變量,右孩子是變量。這裏的 NormalizeEq 是名稱,Eq 是規則類型,針對等值表達式。模式②表示新構建一個等值表達式,只是與原表達式相比,左右孩子互換。示例:1=a => a=1

開務數據庫內置了上百種 RBO 規則,支持大量的 SQL 語句的代數優化,包括傳統的列裁剪、最大最小消除、投影消除、謂詞下推等等,也包括一些複雜的 Join 等下推操作。TryDecorrelateGroupBy,這個規則的 OptGen 規則描述如下:

[TryDecorrelateGroupBy, Normalize]
(InnerJoin | InnerJoinApply
    $left:*
    $right:* &
        (HasOuterCols $right) &
        (GroupBy | DistinctOn
            $input:*
            $aggregations:*
            $groupingPrivate:*
        ) &
        (IsUnorderedGrouping $groupingPrivate)
    $on:*
    $private:*
)
=>
(Select
    ((OpName $right)
        (InnerJoinApply
            $newLeft:(EnsureKey $left)
            $input
            []
            $private
        )
        (AppendAggCols
            $aggregations
            ConstAgg (NonKeyCols $newLeft)
        )
        (AddColsToGrouping $groupingPrivate (KeyCols $newLeft))
    )
    $on
)

TryDecorrelateGroupBy 主要作用在 InnerJoin | InnerJoinApply 操作中,它將 Join“下推”到 GroupBy 運算符中,以嘗試繼續“挖掘”以找到並消除不必要的相關性。最終的希望是觸發 DecorrelateJoin 規則,將 JoinApply 操作符轉換為非 Apply Join 操作符。

SELECT left.x, left.y, input.*
FROM left
INNER JOIN LATERAL
 (
  SELECT COUNT(*) FROM input WHERE input.x = left.x GROUP BY c
) AS input
ON left.y = 10
=>
SELECT CONST_AGG(left.x), CONST_AGG(left.y), COUNT(*)
FROM left WITH ORDINALITY
INNER JOIN LATERAL
 (
  SELECT * FROM input WHERE input.x = left.x
) AS input
ON True
GROUP BY input.c, left.ordinality
HAVING left.y = 10

開務數據庫採用了 Optgen 語言作為 RBO 規則的編寫語言,通過上面的例子可以看出,按照既定模式添加完善 RBO 規則十分便捷,通過編譯可以將規則嵌入到系統 RBO 規則框架中;後續會有更深入的關於 RBO 使用框架與大家分享,敬請期待!


開務數據庫是一款浪潮集團核心研發的先進、安全的雲原生分佈式數據庫;具備雲原生、多中心、高可用、事務強一致等特性,滿足HTAP場景需求。業務範圍覆蓋能源、工業互聯網、政務、教育、金融等多行業。我們是一支平均年齡30歲的年輕團隊,在短短不到三年的時間裏,我們已取得近300項發明專利受理,10項自有產品軟著授權。 熱烈歡迎廣大夥伴加入我們的團隊,熱門崗位火熱招聘中,簡歷投遞郵箱:[email protected] / [email protected]

數據庫存儲內核研發工程師

工作職責:

1、負責存儲子系統的研發路線規劃、架構設計和關鍵技術問題攻關;

2、負責編寫功能測試用例,測試工具進行系統驗證;

3、負責數據庫的系統性能診斷與調優;

4、負責數據庫相關關鍵技術的預研和在團隊中的引導;

5、深入理解業務場景的數據庫存儲需求,針對性的為不同業務場景提供最合適的存儲方案。

任職要求:

1、學歷:本科或者本科以上學歷;

2、專業:計算機或相關專業;

3、專業知識:

— 3 年及以上 GO/C++ 開發經驗;

— 精通 C/C++/GO 語言,Linux 系統編程。熟悉無鎖數據結構,熟悉現代硬件體系結構 (CPU/Cache/Memory/Storage), 熟悉併發編程;

— 熟練使用 MySQL、PostgeSQL 等主流數據庫;

— 熟悉數據庫存儲系統的基本理論,熟悉事務處理,日誌與恢復策略,多版本併發控制技術的實現,對數據庫的基本理論和內部實現機制有深刻的理解;

— 技術視野開闊,有一定的系統性能優化經驗,掌握各種性能診斷工具和各種優化方法;

— 熟悉時序數據庫,有實際的時序數據庫開發經驗優先;

— 熟悉 RocksDB、Arrow、Parquet 等開源存儲項目源碼者優先。

Base 地: 上海 / 天津 / 濟南 / 北京

 

數據庫方案工程師

工作職責:

1、負責分佈式數據庫,或其相關工具、平台等產品的梳理、規劃、設計和推進工作;

2、進行解決方案的調研、設計和驗證;

3、設計、撰寫和維護產品紅皮書;

4、跨部門溝通,協調各類資源以確保產品順利上線,推進產品迭代。

任職要求:

1、5年以上的數據庫運維及方案設計經驗(ORACLE/Mysql/PostgreSQL任意一種),對部署,優化,災備,恢復,高可用有實際經驗;

2、1年左右的分佈式數據庫經驗,瞭解國內任意一款分佈式數據庫,有部署,POC,問題處理經驗;

3、對OLTP和OLAP系統或其中一種有實際運維設計經驗;

4、對數據庫災備,同步方案有實際項目經驗;

5、會一種數據庫benchmark工具,設計相應場景進行測試並結合已有經驗給與相應調整優化;

6、有基本的編程能力,如go,shell,python其中一項,可以寫簡單程序對數據庫進行併發測試,功能驗證;

7、有項目管理能力,很好的溝通能力,可以與開發人員順暢溝通,並於合作高校學生完成實驗及文檔編寫;

8、紮實的技術,linux和數據庫方面有一定積累,能對開發人員及學生進行一定指導,促使相關工作順利推進;

9、較強的文檔編寫組織能力,根據實驗文檔及相關手冊,編寫用户解決方案手冊;

10、有一定語言表達能力,能做數據庫相關功能培訓。

Base地: 上海/天津/濟南/北京