BigQuery 槽是执行 SQL 查询所需的计算容量单位。BigQuery 会根据查询大小和复杂程度,自动计算每个查询所需的槽数。

如需了解每个项目的槽配额,请参阅查询的配额政策

对大多数用户而言,默认槽容量绰绰有余。即便获得更多槽,也不能保证提升每项查询的性能。但更大的槽池有可能提高超大规模或高度复杂的查询的性能,还有可能提升高并发工作负载的性能。要检查您的帐号使用的槽数,请参阅 BigQuery 监控

BigQuery 会根据客户的历史记录、使用情况和支出,自动管理槽配额。如果客户需要保持每月分析支出不变,BigQuery 还提供了固定价格

如果您注册了固定价格方案,则可以购买指定数量的槽用于处理查询。您可以针对关联到该结算帐号的所有项目,按位置分配槽。 如果有意了解固定价格,请与您的销售代表联系

使用槽执行查询

BigQuery 在执行查询作业时,会将声明性 SQL 语句转换为执行图。此执行图会分解为一系列查询阶段,而这些阶段本身是由多组更精细的执行步骤组成。BigQuery 会利用高度分布式的并行架构来运行这些查询,而这些阶段则会建立许多潜在工作器可能并行执行的工作单元模型。各阶段会通过快速分布式 Shuffle 架构相互通信;相关内容已在其他地方更详细地讨论过。

BigQuery 查询执行过程是动态的,也就是说,您可以在查询执行期间修改查询计划。在查询运行时引入的阶段通常用于改进所有查询工作器的数据分布。

BigQuery 可以并发运行多个阶段。 BigQuery 可利用推测性执行技术来加速查询,并可动态地重新划分阶段以实现最佳并行性。

在查询的每个阶段,BigQuery 槽会执行个别工作单元。例如,如果 BigQuery 确定某一阶段的最佳并行化因子为 10,则它会请求 10 个槽以用于处理该阶段。

查询槽。

BigQuery SQL 查询为动态 DAG

在槽资源不足的情况下执行查询

如果查询请求的槽数超过当前可用的槽数,BigQuery 会将个别工作单元排入队列,并等待槽变为可用状态。随着查询继续向前执行以及槽被释放,系统会动态地选取这些已排入队列的工作单元以用于执行。

BigQuery 可以为查询的特定阶段请求任意数量的槽。所请求的槽数与您购买的容量无关,而是指示 BigQuery 为该阶段选择的最佳并行化因子。工作单元会排入队列并在有可用的槽时执行。

如果查询所需的槽数超出了您承诺使用的槽数,系统不会向您收取额外槽的费用,也不会根据额外的按需使用费率收取相关费用。您的各个工作单元只需排队等候。

例如,

  1. 查询阶段请求 2000 个槽,但只有 1000 个槽可用。
  2. BigQuery 会将 1000 个可用槽全部占用,并将另外 1000 个槽排入队列。
  3. 此后,如果有 100 个槽完成了其工作,那么这些槽会从 1000 个已排入队列的工作单元中动态选取 100 个工作单元。其余的 900 个已排入队列的工作单元将继续保留。
  4. 此后,如果有 500 个槽完成了其工作,那么这些槽会从 900 个已排入队列的工作单元中动态选取 500 个工作单元。其余的 400 个已排入队列的工作单元将继续保留。
  5. 以此类推。

槽调度。

BigQuery 槽在所需槽数超过可用数量时排入队列

BigQuery 公平调度机制

BigQuery 利用公平调度机制来在各竞争查询之间分配资源。这意味着所有查询都可以随时平等地访问所有可用槽,并且系统可以自动根据每个活跃查询的容量需求变化在这些查询之间动态地重新分配容量。在以下情况下,您可以在查询完成后提交新的查询进行执行:

  • 只要您提交新的查询,系统就会自动在各执行中查询之间重新分配容量。当每个查询的可用容量增加时,个别工作单元可以正常暂停、恢复及排入队列。
  • 每当有查询完成时,该查询使用的容量都会自动立即提供给其他所有查询使用。
  • 只要查询的容量需求因查询动态 DAG 的更改而发生变化,BigQuery 就会自动重新评估此查询和其他所有查询的可用容量,并根据需要重新分配和暂停槽。

多查询调度。

BigQuery 公平调度机制

根据查询的复杂性和大小,查询可能并不需要其有权使用的所有槽,也可能需要使用更多的槽。在公平调度机制的作用下,BigQuery 会动态地确保所有槽在任何时间点都会得到充分利用。