配额和限制

以下列表简要列出了 BigQuery 的速率限制和配额限制。

BigQuery 会限制传入请求的最大速率,并按项目实施相应的配额政策。具体政策取决于资源可用性、用户个人资料、服务使用记录和其他因素,如有更改,恕不另行通知。

查询作业

以下限制适用于通过运行交互式查询而自动创建的查询作业,以及使用 jobs.query 和查询类型的 jobs.insert 方法调用以编程方式提交的作业。

查询缓存返回结果的查询,仅在 BigQuery 确定其属于缓存命中所需的时长内计入此限制。试运行查询计入此限制。使用 --dry_run 标志或在查询作业中设置 dryRun 属性,可以指定试运行查询。

系统在项目级别应用此限制。如需提高此限制,请与支持团队联系与销售人员联系

  • 对 Cloud Bigtable 外部数据源执行的交互式查询的并发速率限制 - 4 个并发查询

您最多只能对 Cloud Bigtable 外部数据源执行 4 个并发查询。

  • 包含用户定义的函数 (UDF) 的旧版 SQL 查询并发速率限制 - 6 个并发查询

包含 UDF 的旧版 SQL 查询的并发速率限制涵盖交互式查询和批量查询。包含 UDF 的交互式查询也会计入交互式查询的并发速率限制。此限制不适用于标准 SQL 查询。

  • 跨区域联合查询 — 每个项目每天 1 TB

如果 BigQuery 查询处理位置与 Cloud SQL 实例位置不同,则属于跨区域查询。您每天最多可以为每个项目运行 1 TB 的跨区域查询。请参阅 Cloud SQL 联合查询

  • 每日查询大小限制 - 默认情况下无限制

通过设置自定义配额,您可以指定用户可以查询的数据量限制。

  • 每日目标表更新限制 - 每个表每天更新 1500 次

对于查询作业中的目标表,每个表每天最多可以更新 1500 次。目标表更新包括通过以下方式执行的附加操作和改写操作:使用 Cloud Console 或 bq 命令行工具运行查询,或者调用 jobs.query 和查询类型 jobs.insert API 方法运行查询。

  • 查询/脚本执行时间限制 - 6 小时

此限制无法更改。在某些情况下,可以重试查询。发生这种情况时,重试的查询可额外运行六小时,最多可重试三次。这可能导致总运行时间超过六个小时。

  • 每个查询引用的表数上限 - 1000

  • 未解析旧版 SQL 查询的长度上限 - 256 KB

  • 未解析标准 SQL 查询的长度上限 - 1 MB

  • 已解析旧版和标准 SQL 查询的长度上限 - 12 MB

已解析查询的长度限制涵盖查询引用的所有视图和通配符表的长度。

  • 标准 SQL 查询参数的数量上限 - 10000

  • 响应大小上限 - 压缩后 10 GB1

1大小取决于数据的压缩比。实际响应大小可能远大于 10 GB。

将大型查询的结果写入目标表时,不限制最大响应大小。

  • 行大小上限 - 100 MB2

2行大小的上限为近似值,因为该限制基于行数据的内部表示法。系统会在执行查询作业时的某些阶段实施该限制。

  • 表、查询结果或视图定义中的列数上限 - 10000

  • 每个项目中采用按需价格的并发槽数上限 - 2000

单个项目中的所有查询共享 BigQuery 槽。BigQuery 可能会突破此限制以加快查询速度。

如需查看使用的槽数,请参阅使用 Cloud Monitoring 监控 BigQuery

  • 针对 Cloud Bigtable 外部数据源的最大并发查询数 - 4

如需了解适用于 SQL 查询中用户定义的函数的限制,请参阅 UDF 限制

  • 计划查询

虽然计划查询使用 BigQuery Data Transfer Service 的功能,但计划查询不是转移作业,并且不受加载作业配额的约束。计划查询与手动查询受相同的 BigQuery 配额和限制约束。

加载作业

以下限制适用于使用 Cloud Console 或 bq 命令行工具加载数据时自动创建的作业,以及使用加载类型 jobs.insert API 方法以编程方式提交的加载作业。

向 BigQuery 中加载数据时,受以下限制约束。

  • 每个表每天的加载作业数 - 1500 个(包括失败的作业)
  • 每个项目每天的加载作业数 - 10 万个(包括失败的作业)
  • 每个表每天 1500 个加载作业的限制无法提高。
  • 行和单元大小的限制
    数据格式 最大限制
    CSV 100 MB(行和单元大小)
    JSON 100 MB(行大小)
  • 每个表的列数上限 - 10000
  • 文件大小上限:
    文件类型 压缩后 压缩前
    CSV 4 GB 5 TB
    JSON 4 GB 5 TB
  • 每个加载作业的大小上限 - 15 TB(包括 CSV、JSON、Avro、Parquet、ORC 格式的所有输入文件)
  • 作业配置中的源 URI 数上限 - 10000 个 URI
  • 每个加载作业的文件数上限 - 1000 万个(包括与所有通配符 URI 匹配的所有文件)
  • 加载作业执行时间限制 - 6 小时
  • 您必须从数据集所在区域中的 Cloud Storage 存储分区加载数据(此存储分区可以是数据集所在区域中的多区域存储分区或者单区域存储分区),但美国境内的数据集除外,您可以将数据从任何区域加载到美国境内的数据集。

如需了解详情,请参阅简介:将数据加载到 BigQuery

复制作业

以下限制适用于在 BigQuery 中复制表的情况。这些限制适用于使用 bq 命令行工具或 Cloud Console 复制数据时自动创建的作业,以及使用复制类型 jobs.insert API 方法以编程方式提交的复制作业。

  • 每个目标表每天的复制作业数 - 1000 个(包括失败的作业)
  • 每个项目每天的复制作业数 - 10 万个(包括失败的作业)

导出作业

以下限制适用于从 BigQuery 导出数据的作业。以下限制适用于使用 bq 命令行工具或 Cloud Console 导出数据时自动创建的作业,以及使用加载类型 jobs.insert API 方法以编程方式提交的导出作业。

  • 每天的导出作业数 - 每个项目限 10 万个导出作业,每天的数据量上限为 50 TB(所有导出作业的累计数据量限制为 50 TB)
  • 如果每天要导出 50 TB 以上的数据,请使用 BigQuery Storage API

  • 通配符 URI - 每次导出限 500 个通配符 URI

数据集限制

以下限制适用于数据集:

  • 每个项目的数据集数 - 不受限制

  • 每个数据集的表数 - 不受限制
    使用 API 调用时,如果数据集中的表接近 50000 个,枚举性能会变慢。Cloud Console 最多可为每个数据集显示 50000 个表。
  • 数据集的访问控制列表中的授权视图数上限 - 2500
    您可以创建授权视图来限制对源数据的访问。当您不希望用户在查询视图时看到某些列时,可以使用排除了这些列的 SQL 查询来创建授权视图。您最多可以向数据集的访问控制列表添加 2500 个授权视图。
  • 数据集元数据更新操作的速率上限 - 每个数据集每 10 秒执行 5 次操作
    数据集元数据更新限制适用于通过以下方式执行的所有元数据更新操作:使用 Cloud Console;使用 bq 命令行工具;调用 datasets.insertdatasets.patchdatasets.update API 方法。
  • 数据集说明的长度上限 - 16384 个字符
    为数据集添加说明时,说明文本最多可包含 16384 个字符。

表限制

以下限制适用于 BigQuery 表。

所有表

  • 列说明的长度上限 - 1024 个字符

为列添加说明时,说明文本最多只能包含 1024 个字符。

标准表

  • 每天的表操作数上限 - 1500

您每天最多只能对每个表执行 1500 次操作,无论该操作是将数据附加到表还是截断表。

表操作数上限涵盖以下所有加载作业复制作业查询作业的总操作数:向目标表附加数据、覆盖目标表,或者使用 DML INSERTUPDATEDELETEMERGE 语句向表写入数据。DML 语句计数会计入此配额,但不受其限制。换句话说,计入配额的每日操作数包括 DML 语句计数,但 DML 语句不会因为该限制而失败。

例如,如果运行 500 个将数据附加到 mytable 的复制作业和 1000 个将数据附加到 mytable 的查询作业,就会达到配额上限。

  • 表元数据更新操作的速率上限 - 每个表每 10 秒执行 5 次操作

表元数据更新限制适用于通过以下方法执行的所有元数据更新操作:使用 Cloud Console、bq 命令行工具或客户端库;调用 tables.inserttables.patchtables.update API 方法;或者执行 ALTER TABLE DDL 语句。此限制也适用于作业输出。

  • 表、查询结果或视图定义中的列数上限 - 10000

分区表

  • 每个分区表的分区数上限 - 4000

  • 单个作业可修改的分区数上限 - 4000

每个作业操作(查询或加载)最多可影响 4000 个分区。影响的分区数超过 4000 的任何查询或加载作业都会被 BigQuery 拒绝。

  • 每个提取时间分区表的分区修改数上限 - 5000
  • 每个列分区表的分区修改数上限 - 30000

您每天最多只能对一个提取时间分区表进行 5000 次分区修改,每天最多只能对一个列分区表进行 30000 次分区修改。可以使用覆盖或附加到分区数据的操作来修改分区。修改分区的操作包括:加载作业、将结果写入分区的查询,或修改分区数据的 DML 语句(INSERTDELETEUPDATEMERGE)。

单个作业可能会影响多个分区。例如,DML 语句可以更新多个分区中的数据(包括提取时间分区表和分区表)。查询作业和加载作业也可以写入多个分区,但仅限于分区表。DML 语句计数会计入此配额,但不受其限制。换句话说,计入配额的每日操作数包括 DML 语句计数,但 DML 语句不会因为该限制而失败。 BigQuery 在确定某个作业消耗的配额量时,会使用受该作业影响的分区数量。流式插入不会影响此配额。

  • 分区操作的速率上限 - 每 10 秒进行 50 次分区操作

外部表

以下限制适用于以 Parquet、ORC、Avro、CSV 或 JSON 格式将数据存储在 Cloud Storage 中的表。

  • 每个外部表的源 URI 数量上限 — 10000 个 URI
  • 每个外部表的文件数量上限 — 总共 1000 万个文件(包括与所有通配符 URI 匹配的所有文件)
  • 所有输入文件中每个外部表存储在 Cloud Storage 中的数据的大小上限 — 600 TB

    此限制适用于存储在 Cloud Storage 中的文件的大小。此大小与查询价格公式中使用的大小不同。对于外部分区的表,系统会在分区删减后应用此限制。

视图限制

  • 嵌套视图层数上限 - 16

BigQuery 最多支持 16 层嵌套视图。如果嵌套层数超过 16 层,系统会返回 INVALID_INPUT 错误。

  • 用于定义视图的标准 SQL 查询长度上限 - 256000 个字符

创建视图时,标准 SQL 查询的文本最多可以包含 256000 个字符。

  • 数据集的访问控制列表中的授权视图数上限 - 2500

您可以创建授权视图来限制对源数据的访问。当您不希望用户在查询视图时看到某些列时,可以使用排除了这些列的 SQL 查询来创建授权视图。您最多可以向数据集的访问权限控制列表添加 2500 个授权视图。

用户定义的函数 (UDF) 限制

以下限制适用于 SQL 查询中的临时性和永久性用户定义的函数

  • 处理单行数据时 JavaScript UDF 输出的数据量限制 - 约为 5 MB 或更少
  • 包含用户定义的函数 (UDF) 的旧版 SQL 查询并发速率限制 - 6 个并发查询
  • 包含 UDF 的旧版 SQL 查询的并发速率限制涵盖交互式查询和批量查询。包含 UDF 的交互式查询也会计入交互式查询的并发速率限制。此限制不适用于标准 SQL 查询。

  • 查询作业中的 JavaScript UDF 资源(例如内嵌代码 blob 或外部文件)的数量上限 - 50
  • 每个内嵌代码 blob 的大小上限 - 32 KB。
  • 每个外部代码资源的大小上限 - 1 MB。

以下限制适用于用户定义的永久性函数
  • 函数名称的长度上限 - 256 个字符
  • 参数数量上限 - 256
  • 参数名称的长度上限 - 128 个字符
  • 用户定义的函数引用链的深度上限 - 16
  • 类型为 STRUCT 的参数或输出的深度上限 - 15
  • 对于每个 UDF,类型为 STRUCT 的参数或输出中的字段数上限 - 1024
  • 每次查询的唯一 UDF 和表引用总数上限 - 1000 充分扩展后,每个 UDF 可引用的唯一表和 UDF 总数最高为 1000 个。
  • CREATE FUNCTION 语句中的 JavaScript 库数量上限 - 50
  • 包含的 JavaScript 库路径的长度上限 - 5000 个字符
  • 每个 UDF 的更新速率上限 - 5 次/10 秒 创建函数后,每个函数每 10 秒最多可更新 5 次。
  • 每个内嵌代码 blob 的大小上限 - 32 KB
  • 每项 JavaScript 代码资源的大小上限 - 1 MB

数据操纵语言语句

BigQuery DML 语句没有配额限制。

但是,DML 语句会计入每天的表操作数上限每天的分区修改数上限。换句话说,DML 语句不会因为这些限制而失败。

此外,DML 语句受到表元数据更新操作的速率上限的约束。如果您超出此限制,可以在两次重试之间使用指数退避算法的来重试操作。

流式插入

以下限制适用于将数据流式插入 BigQuery

如果您在插入行时没有填写 insertId 字段,系统会应用下面提到的配额。如需了解详情,请参阅停用尽力去重功能。 使用 BigQuery 时建议采用这种方式,以便获得更高的流式提取配额限制。

  • 每秒的字节数上限:1 GB - 如果您在插入每一行时没有填写 insertId 字段,每个项目每秒的限制将为 1 GB。系统在项目级别应用此限制。此限制不会应用于单个表。超过此数量将导致 quotaExceeded 错误。

如果您在插入行时填写了 insertId 字段,系统会应用以下配额。

  • useu 多区域位置中每个项目的每秒行数上限:50 万
    如果您为插入的每一行中填写了 insertId 字段,则在 useu 多区域位置中,每个项目的每秒限制将为 50 万行。此配额是给定多区域位置内的累计式配额。换句话说,对于多区域位置内一个给定项目的所有表,每秒流式插入的总行数不能超过 50 万。此外,每个表的每秒限制为 10 万行。

    超过每个项目的上限或每个表的上限将导致 quotaExceeded 错误。
  • 所有其他位置的每个项目的每秒行数上限:10 万
    如果您为插入的每一行填写了 insertId 字段,除 useu 多区域位置外,所有位置的每个项目或每个表的限制均为每秒 10 万行。此配额是给定区域内的累计式配额。换句话说,对于某区域内一个给定项目的所有表,每秒流式插入的总行数不能超过 50 万。

    超过此数量将导致 quotaExceeded 错误。
  • 每个表每秒的行数上限:10 万
    如果您为插入的每一行填写了 insertId 字段,则每个表每秒的限制将为 10 万行。

    超过此数量将导致 quotaExceeded 错误。
  • 每秒字节数上限:100 MB
    如果您在插入每一行时填写了 insertId 字段,每个表每秒的限制将为 100 MB。

    超过此数量将导致 quotaExceeded 错误。

无论您是否填写了 insertId 字段,以下额外的流式插入配额都适用:

  • 行大小上限:5 MB
    超过此值将导致 invalid 错误。
  • HTTP 请求大小限制:10 MB(参见“注意”)
    超过此值将导致 invalid 错误。
  • 每个请求的行数上限:每个请求 10000 行。
    我们建议最多不要超过 500 行。批处理在一定限度内可以提高性能和吞吐量,但会影响每个请求的延迟时间。每个请求的行数过少,每个请求的开销可导致提取效率低下。每个请求的行数过多,吞吐量可能会下降。

    虽然我们建议每个请求最多使用大约 500 行,但用具有代表性的数据(架构和数据大小)进行实验将有助于您确定理想的批量大小。
  • insertId 字段长度:128
    超过此值将导致 invalid 错误。

如果您的项目需要更多流式插入配额,您可以停用尽力去重功能。如需增加配额,您可以在 Google Cloud Console 中提交申请。提交申请后,您通常会在 2 到 3 个工作日内收到回复。

API 请求

所有 API 请求

以下限制适用于所有 BigQuery API 请求:

  • 每位用户每秒的 API 请求数 - 100
    如果您每秒发出的请求数量超过 100 个,则可能会受到系统的限制。此限制不适用于流式插入
  • 每位用户的并发 API 请求数:300
    如果每位用户发出的并发请求数量超过 300 个,则可能会受到系统的限制。此限制不适用于流式插入。

tabledata.list 请求

tabledata.list 方法可从一组指定的行中检索表数据。包含 jobs.getQueryResults 以及从 jobs.queryjobs.insert 提取结果的其他 API 也会使用此 API 的配额。以下限制适用于 tabledata.list 请求:

  • 每个项目的 tabledata.list 查询数上限:每秒 500 个
    调用 tabledata.list 时,每个项目每秒最多可提交 500 个请求。
  • 调用 tabledata.list 时每个项目每秒返回的字节数上限:每秒 60 MB
    调用 tabledata.list 时,每个项目每秒最多可以返回 60 MB 的表行数据。该限制适用于从中读取数据的表所在的项目。
  • 调用 tabledata.list 时每个项目每秒返回的行数上限:每秒 15 万行
    调用 tabledata.list 时,每个项目每秒最多可以返回 15 万表行。该限制适用于从中读取数据的表所在的项目。

tables.insert 请求

tables.insert 方法可在数据集内创建一个新的空表。以下限制适用于 tables.insert 请求:

  • 每个项目每秒的请求数上限:10 - 调用 tables.insert 时,您每秒最多可以为每个项目创建 10 个请求。此限制涵盖创建表的语句(例如 CREATE TABLE DDL 语句)以及向目标表写入结果的查询

projects.list 请求

projects.list 方法可列出您有权访问的所有项目。以下限制适用于 projects.list 请求:

  • 每个项目每秒的请求数上限:2 - 调用 projects.list 时,您每秒最多可以为每个项目创建 2 个请求。

jobs.get 请求

jobs.get 方法可返回关于特定作业的信息。以下限制适用于 jobs.get 请求:

  • 每个项目每秒的请求数上限:1000 - 调用 jobs.get 时,您每秒最多可以为每个项目创建 1000 个请求。

jobs.query 请求

jobs.query 方法可同步运行 SQL 查询,并在该查询于指定的超时时限内完成的情况下返回查询结果。

  • 响应大小上限:10 MB - 默认情况下,每页结果返回的数据行数没有上限,但响应大小不得超过 10 MB。您可以使用 maxResults 参数更改要返回的行数。

IAM API 请求

当您在 BigQuery 中使用 Identity and Access Management 功能检索和设置 IAM 政策以及测试 IAM 权限时,需遵循以下限制。

  • 在 Google Cloud 项目级别,每个用户每秒的请求数不能超过 25 个。

  • 在 Google Cloud 项目级别,每秒的请求数不能超过 50 个。

如果您的项目需要更多 IAM 配额,可以在 Google Cloud Console 上提交申请。提交申请后,您通常会在 2 到 3 个工作日内收到回复。

BigQuery Storage API 请求

以下限制适用于使用 BigQuery Storage API 进行的 ReadRows 调用:

  • 每分钟调用 ReadRows 的次数:5000 - 使用 BigQuery Storage API 读取数据时,每个项目中每个用户每分钟调用 ReadRows 的次数上限为 5000 次。

以下限制适用于使用 BigQuery Storage API 进行的所有其他方法调用:

  • 每分钟调用 API 的次数:1000 - 每个项目中每个用户每分钟调用 BigQuery Storage API 的次数上限为 1000 次。

何时补充配额?

系统会全天定期补充每日配额,以反映这些配额在限制速率方面的意图。系统还会间歇性刷新,以避免在配额用完时出现长时间中断。通常情况下,系统每过几分钟就会提供更多配额,而不是每天在全局范围内补充一次配额。

问题排查

如需详细了解如何排查配额限制相关的错误,请参阅排查 BigQuery 配额错误

为配额用量设置上限

如需了解如何限制特定资源的用量(最高不超过 Google 指定的限额),请参阅为用量设置上限