◾️はじめに
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