分区表简介

本页面简要介绍 BigQuery 中的分区表支持。

分区表是一种特殊的表,分成多个区段(称为分区),可让您更轻松地管理和查询数据。通过将大型表划分为较小的分区,可以改善查询性能;通过减少查询读取的字节数,可以控制费用。

BigQuery 中有两种类型的表分区:

  • 按提取时间分区的表:按数据的提取(加载)日期或到达日期分区的表。
  • 分区表:根据 TIMESTAMPDATE 列分区的表。

按提取时间分区的表

当您创建按提取时间分区的表时,BigQuery 会自动将数据加载到每日基于日期的分区中,这些分区反映数据的提取或到达日期。通过伪列和后缀标识符,您可以重新组织(替换)数据并将其重定向到特定日期的分区。

提取时间分区表包含名为 _PARTITIONTIME 的伪列,该列包含基于日期的数据加载时间戳。对时间分区表的查询可以通过提供表示分区位置的 _PARTITIONTIME 过滤条件来限制读取的数据。查询会读取指定分区中的所有数据,但 _PARTITIONTIME 谓词过滤条件会限制扫描的分区数量。

创建提取时间分区表时,分区与表具有相同的架构定义。如果您需要将数据加载到其架构与表架构不同的分区中,则必须在加载数据之前更新表架构。或者,您可以在加载作业或查询作业中,使用架构更新选项更新表的架构。

分区表

BigQuery 还允许使用分区表。利用分区表,您可以将分区架构绑定到特定的 TIMESTAMPDATE 列。写入分区表的数据会根据分区列中的日期值(以 UTC 表示)自动传送到相应的分区。

分区表不需要 _PARTITIONTIME 伪列。针对分区表的查询可以根据分区列指定谓词过滤条件,以减少扫描的数据量。

当您创建分区表时,系统会创建两个特殊分区:

  • __NULL__ 分区 - 表示分区列中具有 NULL 值的行
  • __UNPARTITIONED__ 分区 - 表示日期在允许的日期范围之外的数据

__NULL____UNPARTITIONED__ 分区外,分区列中的所有数据都与分区标识符的日期匹配。这样做可让查询确定哪些分区不包含满足过滤条件的数据。用于过滤分区列中数据的查询可以限制值并完全排除不必要的分区。

分区与分片的比较

除了使用分区表之外,您也可以使用基于时间的命名方法(例如 [PREFIX]_YYYYMMDD)对表进行分片。这称为创建日期分片表。使用标准 SQL 或旧版 SQL,您都可以通过 UNION 运算符来指定查询,以限制查询扫描的表。

分区表的效果优于按日期分片的表。如果您创建以日期命名的表,BigQuery 必须为每个以日期命名的表保留架构和元数据副本。此外,使用以日期命名的表时,BigQuery 可能需要分别为每个要查询的表验证权限。该做法也会增加查询开销,影响查询性能。建议的最佳做法是使用分区表,而不是日期分片表。

比较分区选项

下表比较了分片表和分区表。

功能 分片表 按提取时间分区的表 分区表
分区方法 无:对表进行分片并使用 UNION 运算符查询可以模拟分区。 根据数据的提取或到达日期进行分区。可以使用伪列引用分区信息。 根据指定的 TIMESTAMPDATE 列中的数据进行分区。
分区标识符 您可以使用 0001-01-01 和 9999-12-31 之间的任何有效日期,但是 DML 语句无法引用 1970-01-01 之前或 2159-12-31 之后的日期。 已绑定的 DATETIMESTAMP 列中的有效输入。目前,1970-01-01 之前和 2159-12-31 之后的日期值会放在共享的 UNPARTITIONED 分区中。NULL 值位于显式 NULL 分区中。
限制扫描的数据 通过排除查询中不必要的列,仅引用所需分片并限制数据。 使用 _PARTITIONTIME 伪列排除分区。 对分区列使用谓词过滤条件。
分区数量 表的数量没有限制,但查询最多只能引用 1000 个表。 最多 4000 个分区。 最多 4000 个分区。
更新操作 每天最多只能更新 1000 次 单个操作可以提交到单个分区。最新分区(默认)或使用分区修饰器(如 [TABLE]$[DATE])指定的分区。 单个操作最多可以将数据提交到 2000 个不同的分区。
流式插入 表的一个全局缓冲区。 通过使用分区后缀,您可以将数据流式传输到其日期介于当前日期(基于当前世界协调时间 (UTC))之前 31 天至之后 16 天之间的分区。 您可以流式传输介于过去 1 年和未来 6 个月之间的数据。不在此范围内的数据会被拒绝。流式传输数据时,介于过去 7 天到未来 3 天之间的数据会先被放入流式缓冲区中,然后再被提取到相应分区。超出此时段的数据(但日期仍然介于过去 1 年到未来 6 个月之间)会被放在 UNPARTITIONED 分区。当未分区数据达到一定数量时,这些数据会被加载到相应的分区。
时区评估 由用户语义定义 世界协调时间 (UTC) 世界协调时间 (UTC)

分区表配额和限制

分区表在 BigQuery 中有确定的限制

配额和限制也适用于针对分区表运行的不同类型的作业,其中包括:

要详细了解所有配额和限制,请参阅配额和限制

分区表价格

在 BigQuery 中创建和使用分区表时,您的费用取决于分区中存储的数据量以及对数据运行的查询:

很多分区表操作都是免费的,包括将数据加载到分区、复制分区,以及从分区导出数据。这些操作虽然是免费的,但受 BigQuery 的配额和限制的约束。要了解所有免费操作,请参阅价格页面上的免费操作

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面