全部產品
Search
文件中心

AnalyticDB:Dynamic Join Filter

更新時間:Mar 06, 2025

Dynamic Join Filter通過動態收集Hash Join的右表Join鍵資訊,在Join計算前過濾左表中無法Join匹配的資料,從而提升AnalyticDB PostgreSQL版的Hash Join的效能。

注意事項

  • 核心版本為V6.3.8.0及以上版本。如何升級核心版本,請參見版本升級

  • 僅支援Legacy最佳化器,不支援ORCA最佳化器。關於最佳化器的詳細資料,請參見查詢效能最佳化指導

  • 僅支援Laser計算引擎。關於Laser計算引擎的詳細資料,請參見Laser計算引擎的使用

  • 不支援執行計畫中包含IntiPlan的SQL。

  • 支援UDP網路模式,不支援TCP網路模式。

功能介紹

Hash Join是AnalyticDB PostgreSQL版中常用的運算元,95%以上的關聯查詢是通過Hash Join實現的,由於Hash Join涉及到磁碟讀寫、網路互動和大量的計算,通常會成為查詢中的瓶頸。

AnalyticDB PostgreSQL版於V6.3.8.0版本支援Dynamic Join Filter功能,通過動態收集Hash Join的右表Join鍵資訊,在Join計算前過濾左表中無法Join匹配的資料,減少不必要的磁碟讀取、網路和CPU計算開銷,從而提升Hash Join的效能。Dynamic Join Filter原理示意圖如下:

Dynamic Join Filter

關閉或開啟Dynamic Join Filter功能

Dynamic Join Filter功能預設為開啟狀態,您可以通過修改adbpg_enable_dynamic_join_filter參數關閉或開啟Dynamic Join Filter功能,操作方法如下:

  • 會話層級關閉Dynamic Join Filter功能:

    SET adbpg_enable_dynamic_join_filter TO off;
  • 會話層級開啟Dynamic Join Filter功能:

    SET adbpg_enable_dynamic_join_filter TO on;

上述方法僅支援會話層級關閉或開啟Dynamic Join Filter功能,如需執行個體層級關閉或開啟Dynamic Join Filter功能,請提交工單聯絡支援人員進行修改。

使用樣本

以下樣本以TPC-H測試集中的lineitem和part表作為測試資料表,使用TPC-H中的Q17語句為例對比開啟或關閉Dynamic Join Filter功能後的查詢耗時。

說明

本文的TPC-H的實現基於TPC-H的基準測試,並不能與發行的TPC-H基準測試結果相比較,本文中的測試並不符合TPC-H基準測試的所有要求。

  1. 使用TPC-H在本地產生1 GB測試資料,操作方法,請參見產生測試資料

  2. 建立用於測試的lineitem和part表,建表語句如下:

    CREATE TABLE LINEITEM (
        L_ORDERKEY    BIGINT NOT NULL,
        L_PARTKEY     INTEGER NOT NULL,
        L_SUPPKEY     INTEGER NOT NULL,
        L_LINENUMBER  INTEGER NOT NULL,
        L_QUANTITY    NUMERIC(15,2) NOT NULL,
        L_EXTENDEDPRICE  NUMERIC(15,2) NOT NULL,
        L_DISCOUNT    NUMERIC(15,2) NOT NULL,
        L_TAX         NUMERIC(15,2) NOT NULL,
        L_RETURNFLAG  CHAR(1) NOT NULL,
        L_LINESTATUS  CHAR(1) NOT NULL,
        L_SHIPDATE    DATE NOT NULL,
        L_COMMITDATE  DATE NOT NULL,
        L_RECEIPTDATE DATE NOT NULL,
        L_SHIPINSTRUCT CHAR(25) NOT NULL,
        L_SHIPMODE     CHAR(10) NOT NULL,
        L_COMMENT      VARCHAR(44) NOT NULL
    ) WITH (APPENDONLY=TRUE, ORIENTATION=COLUMN)
    DISTRIBUTED BY (L_ORDERKEY, L_LINENUMBER);
    
    CREATE TABLE PART (
        P_PARTKEY     INTEGER NOT NULL,
        P_NAME        VARCHAR(55) NOT NULL,
        P_MFGR        CHAR(25) NOT NULL,
        P_BRAND       CHAR(10) NOT NULL,
        P_TYPE        VARCHAR(25) NOT NULL,
        P_SIZE        INTEGER NOT NULL,
        P_CONTAINER   CHAR(10) NOT NULL,
        P_RETAILPRICE NUMERIC(15,2) NOT NULL,
        P_COMMENT     VARCHAR(23) NOT NULL
    ) WITH (APPENDONLY=TRUE, ORIENTATION=COLUMN)
    DISTRIBUTED BY (P_PARTKEY);
  3. 使用\COPY命令匯入1 GB測試資料,語句如下:

    \COPY LINEITEM FROM 'lineitem.tbl' with DELIMITER '|' NULL '';
    \COPY PART FROM 'part.tbl' with DELIMITER '|' NULL '';
  4. 查看關閉Dynamic Join Filter功能的情況下,Q17查詢的執行耗時。具體步驟如下:

    1. 關閉Dynamic Join Filter功能:

      SET adbpg_enable_dynamic_join_filter TO off;
    2. 執行TPC-H Q17查詢:

      SELECT
          sum(l_extendedprice) / 7.0 as avg_yearly
      FROM
          lineitem,
          part
      WHERE
          p_partkey = l_partkey
          and p_brand = 'Brand#54'
          and p_container = 'SM CAN'
          and l_quantity < (
              SELECT
                  0.2 * avg(l_quantity)
              FROM
                  lineitem
              WHERE
                  l_partkey = p_partkey
          );
    3. 返回結果如下,查詢耗時為3468ms:

           avg_yearly
      ---------------------
       336452.465714285714
      (1 row)
      
      Time: 3468.411 ms
  5. 查看開啟Dynamic Join Filter功能的情況下,Q17查詢的執行耗時。具體步驟如下:

    1. 開啟Dynamic Join Filter功能:

      SET adbpg_enable_dynamic_join_filter TO on;
    2. 執行TPC-H Q17查詢:

      SELECT
          sum(l_extendedprice) / 7.0 as avg_yearly
      FROM
          lineitem,
          part
      WHERE
          p_partkey = l_partkey
          and p_brand = 'Brand#54'
          and p_container = 'SM CAN'
          and l_quantity < (
              SELECT
                  0.2 * avg(l_quantity)
              FROM
                  lineitem
              WHERE
                  l_partkey = p_partkey
          );
    3. 返回結果如下,查詢耗時為305ms:

           avg_yearly
      ---------------------
       336452.465714285714
      (1 row)
      
      Time: 305.632 ms

通過以上樣本可以看出,開啟Dynamic Join Filter功能後,執行時間從3468ms降低到305ms,有效地提升了執行效能。