Slide 1

Slide 1 text

© 2015 - 2024 Nowcast Inc. Query Profile ではじめる Snowflake クエリ最適化 2024/5/21 株式会社ナウキャスト 大野巧作 @Kevinrobot34 SnowVillage Unconference #1 1

Slide 2

Slide 2 text

© 2015 - 2024 Nowcast Inc. アジェンダ / 本日のゴール アジェンダ 1. イントロダクション 2. Query Profile とは 3. Query Profile を使った事例 本日のゴール ● Query Profile の便利さを伝える! 2

Slide 3

Slide 3 text

© 2015 - 2024 Nowcast Inc. 3 1. イントロダクション

Slide 4

Slide 4 text

© 2015 - 2024 Nowcast Inc. 4 1. イントロダクション ● 名前:大野巧作 ○ 大体けびんと呼ばれています ○ X(旧Twitter) は Kevinrobot34 ● 役職:Data Engineer / Data Platform Engineer @ Nowcast ○ POSデータのパイプライン作成・運用 ○ Snowflake x dbt x terraform な社内データ基盤構築・運用 ■ 右下のテックブログに詳細あります! ● 好きなSnowflakeの機能: Query Profile ● Data Cloud Summit 2024 参加します! 自己紹介

Slide 5

Slide 5 text

© 2015 - 2024 Nowcast Inc. 5 1. イントロダクション ● よくある課題 ○ あるクエリの速度が遅い ○ コストが高い ○ … ● これらをどう解消すれば良いか分からない        ↓ これらを解消するためには Query Profile をよく見るのがおすすめ!! Snowflake を使っていて困ったことはないですか?

Slide 6

Slide 6 text

© 2015 - 2024 Nowcast Inc. 6 2. Query Profile とは

Slide 7

Slide 7 text

© 2015 - 2024 Nowcast Inc. 7 2. Query Profile とは ● Snowsight から利用可能な機能で、 クエリに関する詳細な情報を確認可能 ● RedshiftなどのDWHではExplainを使って実行計画を見る、 みたいなことをやったことがある方もいると思いますが、 Snowflakeだとサクッと確認できるのがGood Query Profile とは何か? RedshiftのExplainに関するDocsより Snowsightで見た Query Profile の例

Slide 8

Slide 8 text

© 2015 - 2024 Nowcast Inc. 8 2. Query Profile とは ● Worksheet の Query Details から開く方法と Query History から開く方法があります Query Profile の開き方 Worksheet でクエリを実行した際の Query ID をクリックすると開ける Query History で 対象クエリを探す Profile タブから確認

Slide 9

Slide 9 text

© 2015 - 2024 Nowcast Inc. 9 2. Query Profile とは 構成要素としてはざっくり以下の2つ ● 演算子ツリー ○ 真ん中のグラフ ● 概要・統計 ○ 右側にまとまっている情報 ○ どの処理に時間がかかったかなどの情報 これらのおかげでなんとなくサクッと見るだけでも クエリの悪そうな部分を見つけ出しやすい! Query Profile の要素 演算子ツリー 概要

Slide 10

Slide 10 text

© 2015 - 2024 Nowcast Inc. 10 2. Query Profile とは ● 真ん中のグラフ ● 複雑なクエリの場合には複数ステップが分割されて 表示される場合もある ● ノード / 頂点 ○ どのような処理がされたか ○ TableScan / Filter / Join / Sort など ○ ノードでかかった時間が青いバーですぐ分かる ● エッジ / 辺 ○ ノードで処理したデータが何行となって次の 処理に渡されるかが表されている ○ 右の図の例では Join 前の各テーブルから 何行のデータが読み込まれているか、また Join 後に何行になっているかが分かる ● これらの情報を踏まえ「SQLのこの処理が遅い」 「Joinの仕方が想定と違いそう」などとデバッグや クエリ最適化が捗る Query Profile の要素 演算子ツリー 各ノードの処理の種類 かかった時間 次の処理に渡される データの行数

Slide 11

Slide 11 text

© 2015 - 2024 Nowcast Inc. 11 2. Query Profile とは ● 右側にまとまっているやつ ● 具体的にどのような処理に時間がかかったか、 スキャンしたパーティション数・データ量などの統計、 といった情報がまとまっている ● 統計で見ると良い情報 ○ Partitions scanned / Partitions total ■ いわゆる Pruning の情報 ■ スキャンしたパーティションの割合を見ると良い ■ スキャンするパーティションが減れば 当然クエリは早くなる Query Profile の要素 概要・統計 処理の 概要 統計

Slide 12

Slide 12 text

© 2015 - 2024 Nowcast Inc. 12 2. Query Profile とは ● 右側にまとまっているやつ ● 具体的にどのような処理に時間がかかったか、 スキャンしたパーティション数・データ量などの統計、 といった情報がまとまっている ● 統計で見ると良い情報 ○ Bytes spilled to local / remote storage ■ メモリが足りなくてローカル or リモートストレージ に溢れたデータ量のこと ■ Warehouseを大きくした方が良いかもしれないし、 CTEでクエリを何段階かに分割したりすると 良いかもしれない Query Profile の要素 概要・統計 処理の 概要 統計

Slide 13

Slide 13 text

© 2015 - 2024 Nowcast Inc. 13 2. Query Profile とは ● 右側にまとまっているやつ ● 具体的にどのような処理に時間がかかったか、 スキャンしたパーティション数・データ量などの統計、 といった情報がまとまっている ● ノードをクリックすると、そのノードのみの 概要や統計になる Query Profile の要素 概要・統計 ノードをクリックすると そのノードのみの情報に なる

Slide 14

Slide 14 text

© 2015 - 2024 Nowcast Inc. 14 3. Query Profile 使った事例

Slide 15

Slide 15 text

© 2015 - 2024 Nowcast Inc. 15 3. Query Profile 使った事例 ● 外部テーブルにもパーティションの設定をできる ● dbt_external_tables を使った例 ● このパーティションを適切に使い、dbt incremental model などと組み合わせると高速に差分更新できたりする ○ 外部テーブルはAWS S3などにアクセスしにいく都合パーティションがより大事になる ○ そもそも外部テーブルはあまりたくさん参照しない方が良いという話ももちろんあります 外部テーブルのパーティション 外部ステージから読み 取ったデータ量 外部テーブルの パーティションの情報

Slide 16

Slide 16 text

© 2015 - 2024 Nowcast Inc. 16 3. Query Profile 使った事例 ● dbt incremental model で差分更新をする際の話 ● dbt-snowflake で delete+insert モードで差分更新をしようとすると3ステップで実行される ○ ① insert用データのテーブル作成 ○ ② ①と既存テーブルを突き合わせデータを削除 ○ ③ ①のテーブルをインサート ● ②の削除データを決定するためのデータの 突き合わせのところで、右図のように join が デカルト積となってしまい処理すべきデータの 量がが爆発的に増えてしまった ● 26.47K と 24.06K のデータをJoinして204Mに ● 適切に config を書くと解消できる dbt incremental model で起きた Join の爆発 dbt-adapters [CT-3493] [Bug] unique_key list incremental model has performance issues on the delete phase #150

Slide 17

Slide 17 text

© 2015 - 2024 Nowcast Inc. 17 3. Query Profile 使った事例 ● このような Join の条件の間違いによりデータの結合が デカルト積となってしまい、結果としてデータ量が 爆発してしまうというミスは実はドキュメントでも紹介されている ● dbt だとクエリがコンパイルされていてあまり意識しないが、 Snowflakeで実際に実行されるクエリ自体と向き合うことが大事 dbt incremental model で起きた Join の爆発 Document - クエリプロファイルを使用したクエリの分析 より

Slide 18

Slide 18 text

© 2015 - 2024 Nowcast Inc. 18 3. Query Profile 使った事例 皆さんの事例もぜひ聞かせてください!

Slide 19

Slide 19 text

© 2015 - 2024 Nowcast Inc. 19 References ● Docs - クエリプロファイルを使用したクエリの分析 ● Community - Performance impact from local and remote disk spilling

Slide 20

Slide 20 text

© 2015 - 2024 Nowcast Inc. 20