Technical Articles
Dynamic Joinの活用
はじめに
SAP HANA Viewには、パフォーマンス改善に関する固有機能が複数あります。ここではその機能の一つである、Dynamic Joinの活用方法を紹介します。
下記のブログでは同じくSAP HANA Viewの機能である、Optimize Join Columnsについて紹介しました。Optimize Join Columnsは、クエリ実行で使用するメモリ消費量の最適化を目的とした機能です。
https://blogs.sap.com/2020/12/03/introduction-of-optimize-join-columns/
ここで紹介するDynamic Joinについても、利用目的の一つはメモリ消費量の最適化です。クエリ内部処理の早い段階で集計処理を実行させることで、中間データの削減を可能にします。ただし、使用の前後でクエリの実行結果が変化する場合があるため注意が必要です。
このブログでは、活用方法と注意点を説明します。説明を通して、機能を有効化することのメリットと副次的な影響を理解していただければと思います。
機能概要
シナリオ
下記のsalesテーブルを使用して、業務ユーザがマテリアル(MATERIAL)の販売シェアを計算することを考えます。salesテーブルには、地域(REGION)、国(COUNTRY)ごとの、マテリアルの販売データ(SALES)が含まれています。
この要件を満たすために、下記のSAP HANA Viewを作成します。
SAP HANA Viewの作成手順
- Aggregationノードを作成、データソースとしてsalesテーブルを設定
- すべての項目をOutput Columnsに設定
- Aggregationノードを作成、データソースとしてsalesテーブルを設定
- MATERIALを除くすべての項目をOutput Columnsに設定
- SALESのラベルをTOT_SALESに変更
- Joinノードを作成、データソースとして1で作成したAggregationノードと3で作成したAggregationノードを設定
- 計算列SALES_SHAREを作成(計算式は”SALES”/”TOT_SALES”)
- Joinノードの定義を設定
– REGIONとCOUNTRYを結合列に設定
– Join Typeをinner joinに設定 - 3で作成したAggregationノードの結合列を除く、すべての項目をOutput Columnsに設定
- Aggregationノードを作成、データソースとして6で作成したJoinノードを設定
- すべての項目をOutput Columnsに設定
上記のSAP HANA Viewでは、2つのAggregationノードが結合されています。ポイントは最下部右側のAggregationノード(3で作成したAggregationノード)に、MATERIALが含まれない点です。つまり、このノードは常に特定の地域、国の総売上高(TOT_SALES)を出力します。また、これらのAggregationノードは、二つの結合列(REGIONとCOUNTRY)で結合されています。
このSAP HANA Viewを使用して、国ごとのマテリアルの販売シェアを計算します。実行結果は次のようになります。
Dynamic Joinの活用
このシナリオでDynamic Joinを活用します。Dynamic Joinの設定を有効化して、SAP HANA Viewをビルドします。
このSAP HANA Viewを使用して、国ごとのマテリアルの販売シェアを計算します。実行結果は次のようになります。
この場合、Dynamic Joinの設定前後でクエリの実行結果に変化はありません。しかし、内部処理は設定前後で変化しています。EXPLAIN PLAN句を使用して、設定前後の実行計画を比較します。
- Dynamic Joinが設定されていない場合の実行計画
- Dynamic Joinが設定されている場合の実行計画
ポイントはDynamic Joinが設定されていない場合、結合処理の後で集計処理(上記赤枠内の処理)が実行されている点です。
Dynamic Joinが設定されていない場合は、まず初めにREGION, COUNTRYごとの集計処理とREGION, COUNTRY, MATERIALごとの集計処理が並列実行されます。その後でCOUNTRY, MATERIALごとの集計処理が実行されます。
これに対して、Dynamic Joinが設定されている場合、結合処理後の集計処理は実行されません。
結合処理の前に、REGIONを対象に含まない集計処理が実行されていることがわかります。
この内部処理の違いは、結合列かつクエリの選択リストに含まれていないREGIONが、集計処理の対象であるかどうかに起因しています。
Dynamic Join設定が無効の場合は、内部で結合列(REGIONとCOUNTRY)が、JOINノードよりも下部のノードの集計処理対象に暗黙的に含まれます。これは、結合列が選択リストに含まれているかどうかに依存しません。そのため、今回のシナリオでは、結合処理後に対象からREGIONを除いた集計処理の実行が必要です。
一方でDynamic Joinを有効にすると、選択リストに含まれないREGIONを除いた集計処理が、クエリ処理の早い段階で実行されます。一般的に、集計処理の対象カラムが少ないほど、実行結果として出力されるレコード数は少なくなります。そのため、Dynamic Joinを有効化することで、中間データをレコード数の観点で削減することができます。
設定前後で実行結果が変化する例
Dynamic Joinを使用することで、中間データが削減できることを説明しました。その一方で、クエリ実行結果に副次的な影響を与える場合があります。
前パートで作成したSAP HANA Viewを使用して、地域ごとのマテリアルの販売シェアを計算します。Dynamic Joinの設定前後で、クエリの実行結果は次のように変わります。
- Dynamic Joinが設定されていない場合のクエリ実行結果
- Dynamic Joinが設定されている場合のクエリ実行結果
この実行結果の違いを理解するために、設定前後の実行計画を取得します。
- Dynamic Joinが設定されていない場合の実行計画
- Dynamic Joinが設定されている場合の実行計画
Dynamic Join設定が無効の場合は、前パートで説明した通り、選択リストに含まれないCOUNTRYが集計処理実行時に考慮されます。
初めにREGION, COUNTRY, MATERIALごとの集計処理とREGION, COUNTRYごとの集計処理が並列実行されます。その後に、対象からCOUNTRYを除いた集計処理が実行されます。
Dynamic Join設定が有効の場合は、結合処理の前に、COUNTRYを含まない集計処理が実行されます。その後に、SALES_SHAREの計算処理が実行されます。
このように、Dynamic Joinを有効化することで、クエリの実行結果が変化する可能性があります。有効化する場合は、実行結果が意図通りであるかどうかを十分に検証することが必要です。
前提条件
この機能を使用するための条件は下記の通りです。実行するクエリがこれらを満たす必要があります。
- At least one of the fields involved in the join condition is part of the client query.
少なくとも一つ以上の結合列が、クエリの選択リストに含まれている。
この前提条件を満たさない場合、クエリの実行時にエラーが発生します。
まとめ
Dynamic Joinを使用すると、クエリに含まれる集計処理後の中間データ(レコード数)を削減できます。そのため、リソース消費量を削減することによるパフォーマンス向上が期待できます。ただし、使用することでクエリの実行結果が変わる可能性があります。これらはOptimize Join Columnsを利用する際のポイントとほぼ同じ考え方です。Joinノードが含まれるSAP HANA Viewの実行時間が大きい場合の改善手段の一つとして、Dynamic Join やOptimize Join Columnsの使用をご検討いただければと思います。