クエリ実行グラフを使用して BigQuery 分析クエリを理解し最適化する
Google Cloud Japan Team
※この投稿は米国時間 2022 年 12 月 17 日に、Google Cloud blog に投稿されたものの抄訳です。
BigQuery は、優れたクエリ パフォーマンスを発揮しますが、多数の内部要因と外部要因を持つ複雑な分散システムでもあります。これらの要因はクエリ速度に影響を及ぼす可能性があります。つまり、クエリの実行速度が予想よりも遅い場合や、以前よりも遅い場合、何が起こっているのかを把握するのが困難になることがあります。
クエリ実行グラフは、クエリ実行の詳細を調べるための直感的なインターフェースを備えたグラフです。これを使用すると、実行中または完了したあらゆるクエリのクエリプラン情報をグラフ形式で確認できます。
また、クエリ実行グラフを使用して、クエリのパフォーマンス分析情報を取得することもできます。パフォーマンス分析情報は、クエリのパフォーマンスを改善する際に役立つベスト エフォート型の推奨事項を提供します。クエリのパフォーマンスは多面的なものであるため、パフォーマンス分析情報ではクエリのパフォーマンス全体の一部の情報しか得られない場合があります。
実行グラフ
BigQuery がクエリジョブを実行すると、宣言型の SQL ステートメントを実行グラフに変換し、一連のクエリステージに分割します。クエリステージは、より細かい実行ステップで構成されます。クエリ実行グラフは、実行ステージを視覚的に表現して、対応する指標を示します。すべてのステージが等しくなるわけではありません。他のステージと比べて費用や時間がかかるステージもあります。実行グラフには重要なステージをハイライト表示するための切り替えがあり、これを使用するとクエリの潜在的なパフォーマンス ボトルネックが見つけやすくなります。クエリのパフォーマンス分析情報
詳細な実行グラフに加えて、BigQuery は、クエリのパフォーマンスを低下させている可能性のある要因に関する具体的な分析情報も提供します。
スロット競合
クエリを実行すると、BigQuery はクエリに必要な作業をタスクに分割しようとします。タスクは、ステージから入出力されるデータの単一のスライスです。1 つのスロットがタスクを受け取り、ステージのそのデータスライスを実行します。BigQuery スロットがタスクを並列実行して、高いパフォーマンスを実現できると理想的です。スロットによる実行開始を待機しているタスクがクエリに多数あるにもかかわらず、BigQuery がそれらを実行するのに十分なスロットを確保できない場合、スロット競合が発生します。
シャッフルの割り当て不足
BigQuery は、クエリを実行する前にクエリのロジックをステージに分割します。BigQuery スロットが各ステージのタスクを実行します。スロットは、ステージのタスクの実行を完了すると、中間結果をシャッフルに格納します。クエリのその後のステージでは、シャッフルからデータを読み取ってクエリの実行を続行します。シャッフルに書き込む必要があるデータの量がシャッフルの容量を超えた場合、シャッフルの割り当て不足が発生します。
データ入力スケールの変更
このパフォーマンス分析情報が提供されるのは、クエリの速度低下が発生している場合です。つまり、最後にクエリを実行したときと比べて、クエリで特定の入力テーブルのデータを少なくとも 50% 多く読み取っていることを示しています。テーブル変更履歴を使用して、クエリで使用されているテーブルのサイズが最近増加したかどうかを確認できます。
次のステップ
Google は、グラフの可視化の改善に引き続き取り組んでいます。各ステップに指標を追加することに加えて、パフォーマンス分析情報を拡充することで、クエリの診断がさらに容易になるよう取り組んでいます。これはまだ始まったばかりです。
- BigQuery 管理者 / ソフトウェア エンジニア Samad Lotia