优化 BigQuery 存储

本页面介绍优化 BigQuery 存储的最佳实践。BigQuery 以列式格式存储数据。列式数据库针对跨大量记录汇总数据的分析工作负载进行了优化。由于列通常具有比行更多的冗余,因此该特征通过使用运行长度编码等技术来提高数据压缩性能。如需详细了解 BigQuery 如何存储数据,请参阅 BigQuery 存储概览。优化 BigQuery 存储可以提高查询性能控制费用

BigQuery 提供有关资源的存储使用量的详细信息。如需查看表存储元数据,请查询以下 INFORMATION_SCHEMA 视图:

对表数据进行聚簇

最佳做法:创建聚簇表。

如需优化查询存储,请先对表数据进行聚簇。通过对常用的列进行聚簇,您可以减少查询扫描的总数据量。如需了解如何创建聚簇,请参阅创建和使用聚簇表

对表数据进行分区

最佳做法:使用分区划分大型表。

分区使您可以按一组定义的列特征(例如整数列、时间单位列或注入时间)对数据进行分组和排序。分区可减少查询读取的字节数,从而提高查询性能并控制费用。

如需详细了解分区,请参阅分区表简介

使用表和分区到期时间设置

最佳做法:如需优化存储,请配置数据集分区表的默认到期时间设置。

通过为数据集内新创建的表设置默认的表有效期,您可以控制存储费用,还可以优化存储空间使用情况。表到期后,系统会删除表及其包含的所有数据。如果您在创建数据集时设置该属性,则在有效期过后,系统会删除数据集内创建的所有已到期的表。如果您在创建数据集之后设置该属性,则在有效期过后,系统只会删除已到期的新表。

例如,如果您将默认的表有效期设置为 7 天,系统会在一周后自动删除较早的数据。

如果您只需访问最新数据,则此选项会非常有用。此外,如果您只是测试数据而无需保留数据,则此选项也会非常有用。

如果您按日期划分表,则数据集的默认表有效期将应用于各个分区。您还可以在 bq 命令行工具中使用 time_partitioning_expiration 标志或在 API 中使用 expirationMs 配置来控制分区到期时间。分区到期后,系统会删除分区中的数据,但不会删除分区表,即使该表为空也是如此。例如,以下命令会使分区在 3 天后过期:

bq mk \
--time_partitioning_type=DAY \
--time_partitioning_expiration=259200 \
project_id:dataset.table

将数据存储在 BigQuery 中

最佳做法:将数据存储在 BigQuery 中。

在将 Cloud Storage 中的数据加载到 BigQuery 时,您不需要为加载操作支付费用,但需要支付在 Cloud Storage 中存储数据的费用。数据加载到 BigQuery 之后,就会按照 BigQuery 存储价格计费。您需要为表使用的物理或逻辑存储空间(包括时间旅行存储块)付费。

您不必将较早的数据导出到其他存储选项(例如 Cloud Storage),而是可以利用 BigQuery 的长期存储价格这一优惠。

如果您的某个表连续 90 天未曾修改,则该表的存储价格会自动下降 50%。如果您有一个分区表,则每一个分区都会被视为单独的个体来判断是否适用长期存储价格,并遵循与非分区表相同的规则。

确定长期或短期数据

最佳做法:确定是否需要长期存储行级数据,并且仅长期存储汇总数据。

在许多情况下,事务型数据或行级数据中包含的详细信息在短期内非常有用,但长期来看引用频率较低。在这些情况下,您可以构建汇总查询来计算和存储与此数据关联的指标,然后使用表或分区到期时间有系统地移除行级数据。这样可以降低存储费用,同时确保指标可供长期使用。

缩短时间旅行窗口

最佳做法:根据您的要求,您可以缩短时间旅行窗口。

时间旅行天数从默认值 7 天减少到为对象存储的存储块总数。时间旅行窗口在数据集级层设置。

将数据归档到 Cloud Storage

最佳做法:考虑将数据归档到 Cloud Storage 中。

您可以根据业务对归档的需求将数据从 BigQuery 迁移到 Cloud Storage。最佳做法是在从 BigQuery 导出数据之前考虑 BigQuery 长期价格

后续步骤