すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:動的結合フィルター

最終更新日:Sep 27, 2024

動的結合フィルタ機能は、ハッシュ結合の前に使用して、右側のテーブルの動的に収集された結合キーを使用することによって、左側のテーブルからハッシュ結合と一致しないデータをフィルタリングすることができる。 これにより、AnalyticDB for PostgreSQLのハッシュ結合のパフォーマンスが向上します。

注意事項

  • 動的結合フィルターは、AnalyticDB for PostgreSQL V6.3.8.0以降でのみ使用できます。 AnalyticDB For PostgreSQLインスタンスのマイナーエンジンバージョンを更新する方法については、「マイナーエンジンバージョンの更新」をご参照ください。

  • 動的結合フィルターは、レガシークエリオプティマイザーではサポートされますが、ORCAオプティマイザーではサポートされません。 オプティマイザの詳細については、「クエリのパフォーマンスの最適化」をご参照ください。

  • 動的結合フィルタは、レーザー計算エンジンでのみサポートされます。 レーザー計算エンジンの詳細については、「レーザー計算エンジンの使用」をご参照ください。

  • 動的結合フィルターは、実行計画にIntiPlanを含むSQL文ではサポートされません。

  • 動的結合フィルタは、ユーザデータグラムプロトコル (UDP) に対してサポートされるが、伝送制御プロトコル (TCP) に対してはサポートされない。

機能紹介

AnalyticDB for PostgreSQLでは、ハッシュ結合が一般的に使用され、95% を超える相関クエリを実装できます。 ハッシュ結合がディスクの読み取りと書き込み、ネットワークの相互作用、および大量の計算を伴うため、ハッシュ結合を使用すると、データクエリがボトルネックになる可能性があります。

動的結合フィルター機能は、AnalyticDB for PostgreSQL V6.3.8.0の時点でサポートされています。 この機能は、ハッシュ結合の前に使用して、右側のテーブルの動的に収集された結合キーを使用して、左側のテーブルからハッシュ結合に一致しないデータをフィルタリングします。 このようにして、ディスク読み取り、ネットワーキング、およびCPUコンピューティングオーバーヘッドが削減され、ハッシュ結合のパフォーマンスが向上します。 次の図は、動的結合フィルタの原理を示しています。

Dynamic Join Filter

動的結合フィルター機能の無効化または有効化

デフォルトでは、動的結合フィルター機能が有効になっています。 adbpg_enable_dynamic_join_filterの値を変更して、この機能を無効または有効にすることができます。

  • 次のステートメントを実行して、セッションの動的結合フィルター機能を無効にします。

    SET adbpg_enable_dynamic_join_filter TO off;
  • 次のステートメントを実行して、セッションの動的結合フィルター機能を有効にします。

    SET adbpg_enable_dynamic_join_filter TO on;

インスタンスの動的結合フィルター機能を無効または有効にするには、 チケットを起票し、テクニカルサポート担当者にお問い合わせください。

この例では、TPC-Hテストセットのラインアイテムとパーツテーブルが使用されます。 次のセクションでは、TPC-H Q17を使用して、動的結合フィルター機能が有効になる前後のクエリ期間を比較します。

説明

このトピックで説明するTPC-Hのパフォーマンステストは、TPC-Hのベンチマークテストに基づいて実装されますが、TPC-Hのベンチマークテストのすべての要件を満たすことはできません。 したがって、このトピックで説明されているテスト結果は、公開されているTPC-Hベンチマークテスト結果と比較できません。

  1. TPC-Hベンチマークに基づいて1 GBのテストデータを生成します。 詳細については、TPC-Hの「テストデータの生成」セクションを参照してください。

  2. 次のステートメントを実行して、lineitemテーブルと部品テーブルを作成します。

    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のテストデータをlineitemテーブルと部品テーブルにインポートします。

    \COPY LINEITEM FROM 'lineitem.tbl' with DELIMITER '|' NULL '';
    \COPY PART FROM 'part.tbl' with DELIMITER '|' NULL '';
  4. 動的結合フィルター機能が無効になっている場合、Q17クエリの実行期間を照会します。

    1. 動的結合フィルター機能を無効にします。

      SET adbpg_enable_dynamic_join_filter TO off;
    2. TCP-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. クエリ結果から実行時間を表示します。 実行期間は3,468ミリ秒です。

           avg_yearly
      ---------------------
       336452.465714285714
      (1 row)
      
      Time: 3468.411 ms
  5. 動的結合フィルター機能が有効になっている場合、Q17クエリの実行期間を照会します。

    1. 動的結合フィルター機能を有効にします。

      SET adbpg_enable_dynamic_join_filter TO on;
    2. TCP-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. クエリ結果から実行時間を表示します。 実行期間は305ミリ秒です。

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

動的結合フィルター機能を有効にすると、実行時間が3,468 msから305 msに短縮されるため、クエリのパフォーマンスが大幅に向上します。