スロット

BigQuery スロットとは、SQL クエリの実行に必要な演算能力の単位です。BigQuery はクエリのサイズと複雑さに基づいて、クエリごとに必要なスロットの数を自動的に計算します。

プロジェクトごとのスロットの割り当てについては、クエリの割り当てポリシーをご覧ください。

ほとんどのユーザーにとって、デフォルトのスロットの容量は十分です。利用できるスロットの数が増えても、クエリごとのパフォーマンスが高速化するとは限りません。ただし、スロットプールが大きければ、非常に大規模で非常に複雑なクエリのパフォーマンスが向上するとともに、同時実行数の多いワークロードのパフォーマンスも向上します。アカウントで使用しているスロットの数を確認するには、BigQuery のモニタリングをご覧ください。

BigQuery では、お客様の履歴、使用量、費用に基づいてスロットの割り当てを自動的に管理します。BigQuery では、毎月の分析費用を一定にすることを希望されるお客様向けに、定額料金を用意しています。

定額料金プランに加入する場合は、クエリ処理に使用するスロットの割り当て数を購入します。その請求先アカウントに関連付けられているすべてのプロジェクトのロケーション別にスロットの割り当てを指定できます。定額料金にご興味がある場合は営業担当者にお問い合わせください

スロットを使用したクエリ実行

BigQuery がクエリジョブを実行すると、宣言型の SQL ステートメントを実行グラフに変換し、一連のクエリステージに分割します。クエリステージは、より細かい実行ステップから構成されます。BigQuery は、高度に分散された並列アーキテクチャを利用して、これらのクエリを実行します。ステージは、多くのワーカーを同時に実行できる作業単位をモデル化しています。ステージは、高速の分散シャッフル アーキテクチャを介して相互に通信を行います。このアーキテクチャの詳細については、こちらをご覧ください。

BigQuery のクエリ実行は動的に行われるため、クエリの実行中でもクエリプランを変更できます。クエリの実行中に追加されるステージは、主にクエリワーカー全体にわたるデータ分散を向上させるために使用されます。

BigQuery では、複数のステージを同時に実行できます。BigQuery は投機的実行を活用してクエリを高速化し、ステージを動的に再パーティション分割して最適な並列化を実現できます。

BigQuery スロットにより、クエリの各ステージで個々の作業単位が実行されます。たとえば、ステージの最適並列化係数が 10 であると BigQuery が判断した場合、ステージの処理に 10 スロットがリクエストされます。

クエリスロット

BigQuery SQL クエリは動的 DAG である

スロット リソース エコノミーにおけるクエリ実行

現在利用できるよりも多くのスロットをクエリがリクエストした場合、個々の作業単位は、キューに入れられてスロットが使用可能になるのを待ちます。クエリ実行の処理が進行するにつれて、スロットの解放とともに、キューに格納された作業単位が動的に取得され実行されます。

BigQuery では、クエリの特定の段階で任意の数のスロットをリクエストできます。リクエストされるスロットの数は、購入容量とは関係なく、BigQuery がその段階で選択した最適な並列化係数を示します。作業単位は、キューに入れられ、スロットが使用可能になると実行されます。

クエリ要求がコミットしたスロット数を超えた場合、追加スロットには課金されません。したがって、追加のオンデマンド レートは課金されません。個々の作業単位は単純にキューに入れられます。

次に例を示します。

  1. クエリステージは 2,000 個のスロットをリクエストしていますが、1,000 個のスロットしか利用できないとします。
  2. 1,000 個のスロットがすべて消費され、残りの 1,000 個のスロットがキューに入れられます。
  3. その後、100 個のスロットが作業を終了すると、キューに入れられた 100 個の作業単位から動的に 1,000 個の作業単位が選択されます。900 作業単位がキューに残ります。
  4. その後、500 個のスロットが作業を終了すると、キューに入れられた 900 個の作業単位から動的に 500 個の作業単位が選択されます。キューには、400 作業単位が残ります。
  5. 以降も同様です。

スロットのスケジューリング。

要求量が利用可能量を超えた場合、BigQuery スロットはキューに入れられる

BigQuery のフェア スケジューリング

BigQuery では、フェア スケジューリングを利用して、競合するクエリ間でリソースが割り当てられます。これは、すべてのクエリが使用可能なすべてのスロットにいつでも同等にアクセスできること、および各クエリの要求量が変化すると、アクティブなクエリ間で容量が動的かつ自動的に再割り当てされることを意味します。次の条件の下で、クエリが完了し、新しいクエリが送信されて実行されます。

  • 新しいクエリが送信されるたびに、実行中のクエリ間で容量が自動的に再割り当てされます。個々の作業単位は、各クエリでより多くの容量が使用可能になると、一時停止、再開、キューへの格納が適切に行われます。
  • クエリが完了すると、そのクエリが消費していた容量が他のすべてのクエリですぐに自動的に使用可能になります。
  • クエリの動的 DAG の変更によりクエリの容量が変化するたびに、そのクエリおよびその他のすべてのクエリの利用可能量が自動的に再計算され、必要に応じてスロットが再割り当ておよび一時停止されます。

複数クエリのスケジューリング。

BigQuery のフェア スケジューリング

クエリの複雑さとサイズに応じて、利用できるスロットをすべて利用しない場合もあれば、さらに多くのスロットを必要とする場合もあります。BigQuery では、フェア スケジューリングを行うことにより、すべてのスロットがいつでも完全に使用される状況を動的に実現します。