聚簇表简介

本文简要介绍 BigQuery 中的表聚簇功能。

概览

在 BigQuery 中创建聚簇表时,系统会根据表架构中一个或多个列的内容自动整理表数据。您指定的列用于共置相关数据。使用多个列对表进行聚簇时,指定列时依照的顺序很重要。指定列时的先后顺序决定了数据的排序顺序。

聚簇可以提高某些类型的查询(例如,使用过滤条件子句的查询和聚合数据的查询)的性能。当通过查询作业或加载作业将数据写入聚簇表时,BigQuery 会使用聚簇列中的值对这些数据进行排序。这些值用于将数据整理到 BigQuery 存储的多个块中。当您提交的查询包含基于聚簇列过滤数据的子句时,BigQuery 会使用已排序的块来避免扫描不必要的数据。 如果表或分区低于 1 GB,则聚簇表和未聚簇表之间的查询性能可能不会有显著差异。

同样,当您提交的查询基于聚簇列中的值来聚合数据时,因为已排序的块会共置包含类似值的行,所以性能会得到改进。

何时使用聚簇

BigQuery 支持对分区表和非分区表进行聚簇。

在以下情况下使用聚簇:

  • 运行查询前无需严格的费用保证。
  • 您需要比分区单独允许更多的粒度。除了分区优势外,您还可以使用聚簇优势,还可以对分区和聚簇使用相同的列。
  • 您的查询通常对多个特定列使用过滤器或聚合。

在以下情况下使用分区:

  • 在运行查询之前,您需要严格的费用保证。
  • 您需要分区级层管理。例如,您需要设置分区过期时间,而不是表过期时间。
  • 您想要指定数据的分区方式以及每个分区中的数据。例如,您想要定义时间粒度或定义为整数范围分区对表分区的范围。

在以下情况下,首选聚簇而非分区:

  • 分区会生成每个分区的少量数据(约为 1 GB)。
  • 分区会导致大量分区超出 分区表的限制
  • 分区会导致您的更改操作频繁修改表中的大多数分区(例如每隔几分钟)。

当您结合使用聚簇和分区时,可以按日期或时间戳列对数据进行分区,然后按不同的列组合对该数据进行聚簇。在这种情况下,每个分区中的数据都基于聚簇列的值进行聚簇。通过分区,您可以准确了解查询(基于扫描的分区)费用估算值。

对分区表进行聚簇

在分区表中,数据存储在物理块中,而每个物理块都包含一个数据分区。在对分区表进行的以下所有修改操作中,分区表都会保持这些属性:查询作业、数据操纵语言 (DML) 语句、数据定义语言 (DDL) 语句、加载作业、复制作业。相对于未分区的表,这要求 BigQuery 保留更多的元数据。随着分区数量的增加,元数据开销量也会增加。

虽然必须维护更多元数据,但通过确保在全局范围内对数据进行分区,BigQuery 可以在您运行查询之前更准确地估算查询将处理的字节数。这种费用计算方式会对查询的最终费用设置上限。

在聚簇表中,BigQuery 会根据聚簇列中的值自动排序数据,并将数据整理为大小最为合适的存储块。您可以通过创建进行了聚簇和分区的表来实现更精细的排序。在对聚簇表进行修改的每个操作的上下文中,聚簇表都维护排序属性。因此,BigQuery 可能无法准确地估算查询处理的字节数或查询费用。如果在查询期间消除数据块,BigQuery 即可最大限度地降低查询费用。

自动重新聚簇

当数据添加到聚簇表时,新插入的数据写入到的块包含的键范围,可以与先前写入的块中的键范围重叠。这些重叠的键会削弱表的排序属性。

为了维护聚簇表的性能特征,BigQuery 会在后台执行自动重新聚簇以恢复表的排序属性。对于分区表,系统会为每个分区范围内的数据维护聚簇操作。

聚簇表配额和限制

将聚簇表功能与分区表一起使用时,您需要遵循分区表限制

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

如需了解所有配额和限制的详情,请参阅配额和限制

聚簇表价格

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

许多聚簇表操作都不会产生费用,包括将数据加载到聚簇表、复制表和分区以及导出数据。但这些操作受 BigQuery 配额和限制的约束。如需了解所有免费操作,请参阅价格页面上的免费操作

要查看详细的聚簇表价格示例,请参阅价格页面。

后续步骤