クエリ実行グラフを使用した BigQuery 分析クエリのトラブルシューティングと最適化
Google Cloud Japan Team
※この投稿は米国時間 2023 年 9 月 29 日に、Google Cloud blog に投稿されたものの抄訳です。
私たちは皆、クエリをより速く、より適切に、より安価に実行したいと考えています。BigQuery は確かにそれを実現しています。しかし、クエリはすぐに複雑になる可能性があるため、手動による最適化が必要かつ避けられない場合があります。
複雑な分散システムである BigQuery では、多数の内部要因と外部要因がクエリの速度に影響する可能性があります。起きている事象を把握するのは少し難しいかもしれません。この点を解決するために、Google は数か月前にパフォーマンス分析情報を提供するクエリ実行グラフのプレビュー版を公開しましたが、このたび、一般提供を開始できることになりましたのでお知らせします。
Mercadolibre は、BigQuery で毎日数百万のクエリを処理している中南米の大手企業です。「クエリ実行グラフがあればクエリが遅くなっている箇所を確認することができ、多くの場合、最適化を行うための正しい方向を示してくれます」と Mercadolibre のデータ&分析エキスパートである Fernando Ariel Rodriguez 氏は述べています。
クエリ実行グラフは、クエリ実行の重要な詳細を大きく映し出す虫メガネのようなものと考えてください。つまり、クエリ実行グラフは、理解しやすいグラフィック形式にクエリプラン情報を変換し、各ステップの詳細情報を提供します。対象が進行中のクエリであっても、完了したクエリであっても(失敗したクエリにも近日対応予定)、クエリ実行グラフは内部で起きている事象を把握するための優れた方法になります。
さらに素晴らしいことに、クエリ実行グラフはパフォーマンス分析情報も提供します。これは、クエリのパフォーマンスを向上させるための提案を行うことを目的とするもので、井戸端会議の耳寄り情報のようなものです。ただし、優れた探偵小説と同様に、全体像を把握するには複数の角度から検討する必要があるのが常であり、こうした分析情報はパズルのピースを提供するものにすぎないことにご注意ください。
さらに詳しく
ここで、クエリのパフォーマンス分析情報の複雑さについて詳しく確認してみましょう。BigQuery が動作すると、SQL ステートメントがクエリプランに変換され、さまざまな実行ステップで構成されるステージに分割されます。ステージはそれぞれ独特なもので、中にはリソースを大量に消費し、時間がかかるものもあります。しかし、実行グラフを使用すると、こうした潜在的な速度の低下を簡単に見つけることができます。
もちろんそれだけではありません。BigQuery は、眺めの良いルートをクエリに選択させる可能性のある潜在的な要因についての分析情報も提供します。
スロット競合についてはご存じでしょうか?クエリを実行すると、BigQuery は作業を管理しやすいタスクに分割しようとします。その後、こうしたタスクはそれぞれスロットに割り当てられます。最大限の効率を実現するには、各スロットがそれらのタスクを並行して処理するのが理想的です。しかし、タスクを取得するのに十分なスロットがない場合は、スロットの競合状況が発生します。
また、「シャッフルの割り当て不足」の問題もあります。この問題について簡単に説明しましょう。スロットはタスクを完了すると、中間結果を「シャッフル」に保存します。その後のクエリのステージでは、このシャッフルからデータを取り出します。ただし、シャッフルに書き込むデータの量がシャッフルの容量を超えた場合、「シャッフルの割り当て不足」の問題が発生することがあります。
クエリで上述の問題のいずれかが発生した場合は、クエリを最適化して使用するリソースを減らすか、割り当てるリソースを増やすか、ワークロードを分散してピーク需要を回避するかなどの解決策を検討します。
データ集約型の結合の複雑さにも対処する必要があります。クエリの両側で一意でないキーを使用する結合が含まれている場合、入力テーブルよりもはるかに大きい出力テーブルが作成される可能性があります。この出力行数と入力行数の差異は、重大な偏りを示しています。賢明なアナリストの皆様は JOIN 条件を注意深く確認するようにしてください。出力テーブルのサイズが肥大化することを予想していましたか?クロス結合は避けるのが無難ですが、クロス結合を使用する必要がある場合は、暫定的な結果の集計のために GROUP BY 句を追加することを検討してください。あるいは、ウィンドウ関数が役立つ場合もあります。
最後に、データ入力スケールが変更される可能性があります。これは基本的に、前回クエリを実行したときよりも少なくとも 50% 多いデータをクエリがテーブルから読み取ることになる場合です。「どうしてそうなったのか」と疑問に思われるかもしれません。一つの可能性としては、クエリで使用されるテーブルのサイズが直前の時期に大きくなったことが考えられます。テーブルの変更履歴を使用すれば、これを入念に確認できます。
組織全体にわたるクエリのパフォーマンス分析情報を表示する
次に示すとおり、INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION ビューに対してクエリを実行することで、組織全体に関する分析情報を簡単に取得できます。
上記のクエリの出力は、パフォーマンス分析情報が生成された組織内のすべてのクエリジョブと、Google Cloud コンソールのクエリ実行グラフにディープリンクされた生成後の URL を返します(これにより、クエリのステージと各ステージの分析情報を視覚的に調査できます)。
次のステップ
では、クエリ実行グラフとパフォーマンス分析情報は今後どうなっていくのでしょうか。Google はこれらの機能を継続的にファインチューニングしていく予定です。指標の増加、パフォーマンス分析情報の追加、より直感的なグラフの可視化が計画されています。まだ準備を進めている段階ですので、今後のエキサイティングな最新情報にご期待ください。
クエリの詳細を把握し、最適化することをご希望の方は、BigQuery のクエリ実行グラフとパフォーマンス分析情報をぜひご活用ください。この機能に関するご意見やご要望などがございましたら、bq-query-inspector-feedback@google.com までお気軽にご連絡ください。また、この機能の詳細については、公開ドキュメントをご覧ください。
-データ分析担当プロダクト マネージャー Vinay Yerramilli
-BigQuery、ソフトウェア エンジニア Samad Lotia