【Snowflake】Snowflake ~ 結合爆発 / Join Explosion ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2023/09/05/161817

で、結合爆発 (Join Explosion)を触れたが
また、これが原因でパフォーマンスが悪化する事案がありそうなので
復習をする

目次

【1】結合爆発 (Join Explosion)
【2】何が起こるのか?
【3】発生原因
【4】Snowflakeでの確認方法
【5】対処方法
 1)対応策1:結合関係の見直し
 2)対応策2:サブクエリ or CTE(共通テーブル式)の活用
 3)対応策3:集約(GROUP BY)を先に行う

【1】結合爆発 (Join Explosion)

https://zenn.dev/indigo13love/articles/b93ab72f34aa72

より抜粋
~~~~~~~~~~~~~~~
Join Explosion (結合爆発) は、
結合の左右それぞれのテーブルの行数)に対して
結合結果の行数が急激に大きくなってしまっている状況のこと
~~~~~~~~~~~~~~~

なお、Snowflake固有ではなく、DB全般で発生する現象。

【2】何が起こるのか?

* パフォーマンス劣化
 => 結合後のレコード数が膨大になり、クエリ実行に非常に時間がかかる
 => 複雑な結合によりDBサーバーがリソース不足に陥る可能性
 => 時テーブルやソート処理が増え、メモリやディスクI/Oを圧迫

* 結果が重複
 => 重複した行が大量に返り、分析や集計結果が不正確になる

【3】発生原因

* 結合キーが正しくないと、全結合のような膨大な組み合わせが生成される

* 多対多のテーブル同士の結合
* 一意ではないキーでテーブルを結合

【4】Snowflakeでの確認方法

* Snowflake のクエリプロファイルで、
 JOIN前の件数とJOIN後の件数で、
 JOIN前の件数(e.g. 100M)よりJOIN後の件数(e.g. 150G)が桁違いで多かった場合
 結合爆発が発生している可能性が高い

Snowflakeのパフォーマンス改善 ~ クエリプロファイル / 実行計画 ~
https://dk521123.hatenablog.com/entry/2023/09/12/194705

【5】対処方法

1)対応策1:結合関係の見直し

* 多対多を避けられないかを検討

2)対応策2:サブクエリ or CTE(共通テーブル式)の活用

* 先に必要なデータを絞ってから結合することで、行数を抑える

3)対応策3:集約(GROUP BY)を先に行う

* 結合前に集計しておくことで、結合後の膨張を防ぐ

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ MERGE の使用上の注意 ~
https://dk521123.hatenablog.com/entry/2023/09/05/161817
Snowflakeのパフォーマンス改善 ~ クエリプロファイル / 実行計画 ~
https://dk521123.hatenablog.com/entry/2023/09/12/194705
Snowflake ~ QUERY_HISTORY ビュー ~
https://dk521123.hatenablog.com/entry/2024/10/09/155708
Snowflake ~ エラー時の解析方法 ~
https://dk521123.hatenablog.com/entry/2022/04/20/192334