なむなむ

@namb_nam による恥晒し

BigQueryのクエリパフォーマンス最適化を学ぶ①

ベストプラクティスを学ぶシリーズ、どんどん続けていくぞ。

cloud.google.com

クエリパフォーマンスの概要

クエリパフォーマンスに影響する要素

  • 入力データとデータソース(I/O): クエリで何バイト読み取るか。
  • ノード間の通信(シャッフル): クエリから次の段階に何バイト転送するか。クエリは各スロットに何バイトずつ渡すか。
  • コンピューティング: クエリにはどのくらいの CPU 作業が必要か。
  • 出力(実体化): クエリは何バイト書き込むか。
  • クエリのアンチパターン: クエリは SQL のベスト プラクティスに従っているか。

チェック方法

クエリプランとタイムライン

  • BigQuery のクエリジョブには、診断で使用できるクエリプランとタイミング情報が埋め込まれる
    • 長期実行されるクエリの場合は定期的に更新される
  • 実行リソースを使用しないクエリジョブ(ドライランやキャッシュ利用)の場合は、他の統計情報が提供されるか、何もないかのいずれか

  • クエリアーキテクチャは動的である

    • クエリ実行中にクエリプランが変更される可能性がある
    • クエリ実行中に追加されるステージは、ワーカー全体にわたるデータ分散を向上させる
    • 変更されたクエリプランでは、ステージに”パーティション再設定ステージ”とラベルがつく
  • クエリ全体の進行状況を把握する際、実行のタイムラインを確認する

    • ワーカー内で完了・保留中_アクティブな作業単位の数が確認できる
    • クエリの複数ステージにアクティブワーカーが複数存在する場合がある

用語説明

  • 実行グラフ
  • クエリステージ

  • クエリプランの用語

    • 作業単位
    • ワーカー
    • スロット
      • コンピューティング、メモリ、I/O リソースなど、クエリの実行に必要な複数のファセットを抽象的に表す
      • ジョブ統計の概要では、この抽象的な単位に基づき、個々のクエリの totalSlotMs を表示