動的結合フィルタ機能は、ハッシュ結合の前に使用して、右側のテーブルの動的に収集された結合キーを使用することによって、左側のテーブルからハッシュ結合と一致しないデータをフィルタリングすることができる。 これにより、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コンピューティングオーバーヘッドが削減され、ハッシュ結合のパフォーマンスが向上します。 次の図は、動的結合フィルタの原理を示しています。

動的結合フィルター機能の無効化または有効化
デフォルトでは、動的結合フィルター機能が有効になっています。 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ベンチマークテスト結果と比較できません。
TPC-Hベンチマークに基づいて1 GBのテストデータを生成します。 詳細については、TPC-Hの「テストデータの生成」セクションを参照してください。
次のステートメントを実行して、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);次の \COPYステートメントを実行して、1 GBのテストデータをlineitemテーブルと部品テーブルにインポートします。
\COPY LINEITEM FROM 'lineitem.tbl' with DELIMITER '|' NULL ''; \COPY PART FROM 'part.tbl' with DELIMITER '|' NULL '';動的結合フィルター機能が無効になっている場合、Q17クエリの実行期間を照会します。
動的結合フィルター機能を無効にします。
SET adbpg_enable_dynamic_join_filter TO off;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,468ミリ秒です。
avg_yearly --------------------- 336452.465714285714 (1 row) Time: 3468.411 ms
動的結合フィルター機能が有効になっている場合、Q17クエリの実行期間を照会します。
動的結合フィルター機能を有効にします。
SET adbpg_enable_dynamic_join_filter TO on;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 );クエリ結果から実行時間を表示します。 実行期間は305ミリ秒です。
avg_yearly --------------------- 336452.465714285714 (1 row) Time: 305.632 ms
動的結合フィルター機能を有効にすると、実行時間が3,468 msから305 msに短縮されるため、クエリのパフォーマンスが大幅に向上します。