ablog

不器用で落着きのない技術者のメモ

Amazon Redshift Query Profiler でシステマチックにクエリのボトルネックを分析する

re:Invent に参加されていた AWS エンジニアのみなさま、おつかれさまでしたm(._.)m
このエントリは AWS Analytics Advent Calendar 2024 の9日目の記事です。
8日目は 細かすぎて伝わらない Amazon Redshift のシステムテーブル/ビュー選手権: SYS_QUERY_HISTORY に user_query_hash と generic_query_hash が追加された - ablog でした(ワシやないかい!)。

細かすぎて伝わらない Amazon Redshift のシステムテーブル/ビュー選手権: SYS_QUERY_DETAIL に plan_node_id 列が追加された - ablog でシステムテーブル/ビューを使って、クエリのボトルネック分析でどのセグメント・ステップで時間を要しているか特定した後、実行計画のどのオペレーションと対応するかを解説しましたが、Query Profiler の登場でサクッと GUI でできるようになりました(先週、飲み会で大薗さんに教えてもらいましたw)!

ボトルネック分析方法

クエリの経過時間の内訳(ロック待ち/コンパイル時間/実行時間など)を確認する
  • Total elapsed time でサーバサイドでのクエリの実行時間を確認する: この時間が短い場合は Redsfhit がボトルネックではない
  • Total elapsed time の内訳(Execution time/Queue time/Lock wait time/Planning time/Compile time)を確認する: Execution time の割合が高い場合は実行計画レベルでドリルダウンして遅いオペレーションを深掘りする


実行計画のどのオペレーションがボトルネックか特定する
  • Query plan タブを選択、Child query をクリックする(複数の Child query が存在する場合は最も Execution Time が長いものを選択)。

  • 右ペインの [Child query streams] で [Percentage] の割合が最も高い Stream を選択すると、該当する実行計画のオペレーションがハイライトされ(中央)、Stream の実行統計が表示されます(右下)。

  • Child query text でクエリ文を確認する(ユーザーが発行したクエリが複数の Child query に分割されている場合はクエリのどの部分が対応するかを確認できます)。


ボトルネックの要点のみ解説しましたが、Query Profiler の画面への辿り着き方は [新機能] Amazon Redshift Query Profilerを試してみました | DevelopersIOAmazon Redshift のクエリのコンパイルから実行までの流れや Stream って何という方は AWS Summit Tokyo 2023 で発表した "Amazon Redshift クエリパフォーマンスチューニング Deep Dive" のスライド - ablog をご覧ください。

10日目は @nogamincho さんです、いってらっしゃい!

環境

  • Amazon Redshift
    • Region: us-east-1
    • Node type: ra3.4xlarge x 4 node
    • Patch version: 186