Dynamic Join Filter

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,有效地提升了执行性能。