【Snowflake】Snowflakeのパフォーマンス改善 ~ クエリプロファイル / 実行計画 ~

■ はじめに

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

において、Mergeでパフォーマンス悪化した際に
クエリプロファイルの「JoinFilter」と「JoinKey」とか学んだので
徐々にメモしていく

目次

【1】クエリプロファイル
【2】実行計画
 1)SQL文
【3】演算子
 1)JoinFilter
 2)JoinKey
【4】統計
 1)Pruning
 2)Spilling

【1】クエリプロファイル

* クエリ実行の詳細を視覚化できる機能

=> クエリの実行中のパフォーマンスに対して、
  ボトルネックを探ることができる

【2】実行計画

* SQL実行するために使用される手順の組合せ

1)SQL

* EXPLAIN文で出力可能

https://docs.snowflake.com/ja/sql-reference/sql/explain
構文

EXPLAIN USING TABULAR [対象SQL];

-- TABULAR: 通常、人にとって読みやすい出力形式はJSONよりも表形式です。
--  => デフォルトなので、指定しなくてもいいが、、、
-- cf. tabular (タビュラー) = 平たい、表の、表にした

構文

EXPLAIN USING TABULAR
 SELECT * FROM xxxx WHERE id='XXX' ...
;

【3】演算子

https://docs.snowflake.com/ja/user-guide/ui-query-profile#operator-types

1)JoinFilter

* クエリプランでさらに結合の条件に一致しない可能性があると
 識別できるタプルを削除する特別なフィルタリング操作。
 => (将来的にも含めて)パフォーマンス悪化する可能性があるかも、、、

実際にあった話
https://dk521123.hatenablog.com/entry/2023/09/05/161817

において、
MERGE文のON句を以下のようなOR句を使ったケースで
クエリプロファイルを確認したところ、
JoinFilterで「Additional Join Condition (一部の結合では、
不平等ベースの述語を含む条件が使用される)」となり、
パフォーマンスが悪かった
~~~~~~~
ON
  -- OR句でフルスキャンしてしまう場合、レスポンス遅延する可能性がある
  CASE WHEN t.id IS NOT NULL THEN
    t.sub_id = s.sub_id OR t.xxx = s.xxxx
  ELSE
    t.id = s.id
  END
~~~~~~~

公式ドキュメントの注釈には、以下のように記載されている

https://docs.snowflake.com/ja/user-guide/ui-query-profile#data-processing-operators

~~~~~~~
注釈
等しくない結合述部は、
処理速度を大幅に低下させる可能性があるため、
可能であれば回避する必要があります。
~~~~~~~

2)JoinKey

* (公式ドキュメントに記述がないけど)キーで適切にJOINしている
 => パフォーマンス的には「JoinFilter」より望ましい状態

【4】統計

https://docs.snowflake.com/ja/user-guide/ui-query-profile#statistics

* Pruning / Spilling に関する詳細は、以下の関連記事を参照のこと

Snowflakeのパフォーマンス改善 ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/09/20/002235

1)Pruning

* テーブルのプルーニングの影響に関する情報

Partitions scanned

* これまでにスキャンされたパーティションの数。

Partitions total

* 特定のテーブル内のパーティションの総数。

2)Spilling

* 中間結果がメモリに収まらない操作のディスク使用量に関する情報:

Bytes spilled to local storage

* ローカルディスクに流出したデータの量

Bytes spilled to remote storage

* リモートディスクに流出したデータの量

参考文献

https://blog.truestar.co.jp/snowflake/20221130/52144/

関連記事

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/20/002235