BigQueryのクエリパフォーマンス最適化を学ぶ①
ベストプラクティスを学ぶシリーズ、どんどん続けていくぞ。
クエリパフォーマンスの概要
クエリパフォーマンスに影響する要素
- 入力データとデータソース(I/O): クエリで何バイト読み取るか。
- ノード間の通信(シャッフル): クエリから次の段階に何バイト転送するか。クエリは各スロットに何バイトずつ渡すか。
- コンピューティング: クエリにはどのくらいの CPU 作業が必要か。
- 出力(実体化): クエリは何バイト書き込むか。
- クエリのアンチパターン: クエリは SQL のベスト プラクティスに従っているか。
チェック方法
- クエリごとに生成されるクエリプランで、実行の統計情報を確認できる
- 詳細→クエリプランとタイムライン
クエリプランとタイムライン
- BigQuery のクエリジョブには、診断で使用できるクエリプランとタイミング情報が埋め込まれる
- 長期実行されるクエリの場合は定期的に更新される
実行リソースを使用しないクエリジョブ(ドライランやキャッシュ利用)の場合は、他の統計情報が提供されるか、何もないかのいずれか
クエリアーキテクチャは動的である
- クエリ実行中にクエリプランが変更される可能性がある
- クエリ実行中に追加されるステージは、ワーカー全体にわたるデータ分散を向上させる
- 変更されたクエリプランでは、ステージに”パーティション再設定ステージ”とラベルがつく
クエリ全体の進行状況を把握する際、実行のタイムラインを確認する
- ワーカー内で完了・保留中_アクティブな作業単位の数が確認できる
- クエリの複数ステージにアクティブワーカーが複数存在する場合がある
用語説明
- 実行グラフ
クエリステージ
- 実行グラフを分割したもの
- 実行ステップで構成される
- 多くのワーカーを同時に実行できる作業単位をモデル化
- 高速の分散シャッフルアーキテクチャを介して相互通信
- In-memory query execution in Google BigQuery
クエリプランの用語
- 作業単位
- ワーカー
- スロット
- コンピューティング、メモリ、I/O リソースなど、クエリの実行に必要な複数のファセットを抽象的に表す
- ジョブ統計の概要では、この抽象的な単位に基づき、個々のクエリの
totalSlotMs
を表示