はじめに
Snowflakeに限らずですが、データべースはSQLを実行する前にオプティマイザが実行計画を作成してからSQLを実行します。
SQLが帰ってこないとき、SQLが処理しているかどこではまっているのか実行計画・実行統計を見て確認をします。
実行計画・実行統計の見方(実行中・実行後のSQLの場合)
実行中、実行後のSQLはSnowsightからアクティビティ⇒クエリ履歴⇒SQLを選択⇒「クエリプロファイル」タブで参照することができます。
このSQLでは右下の「統計」を見ると「リモートストレージにスピル」という項目が表示されていることがわかります。
Snowflakeでは内部メモリ内で処理できない場合、一時領域としてローカルストレージを使用し、それでも不足する場合はリモートストレージ(AWSであればS3)に処理を逃がします。
リモートストレージにスピルするような処理は特に時間がかかり、コストがかかる上に帰ってこないSQLになっていると思いますのでSQLを見直さないといけません。
SQLで負荷の高い処理は画面右上の「最も負荷の高い深いノード」に表示され、以下のようにノードを選択すると具体的にSQLのどの句を処理しているのか、を見てSQL修正の参考にすることができます。
SQL実行前にどのような実行計画になるか確認する
SQLを実際に実行する前に実行計画を確認することができます。
または多くのテーブルをjoinして実行計画が複雑でグラフィカルな表示では見ずらい場合にEXPLAIN文を実行して確認します。
- テーブル形式で参照する場合
こちらは実行順序は直感的にはわかりずらいのですがどこがネックになりやすそうか、は一番見やすいかもしれません。
EXPLAIN USING TABULAR
SELECT XX FROM XX .. (←実行計画を見たいSQL文)
- TEXT形式で参照する場合(個人的にはこちらのほうが見やすい)
EXPLAIN USING TEXT
SELECT XX FROM XX .. (←実行計画を見たいSQL文)
実行計画の出力項目の意味は以下を参照ください。
参考URL:
https://docs.snowflake.com/ja/sql-reference/sql/explain.html#output
query_idがわかる場合は以下で取得することもできます。
SELECT SYSTEM$EXPLAIN_JSON_TO_TEXT(SYSTEM$EXPLAIN_PLAN_JSON('<query-id>'));
おわりに
今回は初級編ということで、基本的な操作や高負荷SQLで表示される項目を紹介しました。
私自身より深い知識を得たらまた中級編以降を書こうと思います。
参考URL:
https://docs.snowflake.com/ja/sql-reference/sql/explain.html