优化 BigQuery 存储
本页面介绍优化 BigQuery 存储的最佳实践。BigQuery 以列式格式存储数据。列式数据库针对跨大量记录汇总数据的分析工作负载进行了优化。由于列通常具有比行更多的冗余,因此该特征通过使用运行长度编码等技术来提高数据压缩性能。如需详细了解 BigQuery 如何存储数据,请参阅 BigQuery 存储概览。优化 BigQuery 存储可以提高查询性能并控制费用。
BigQuery 提供有关资源的存储使用量的详细信息。如需查看表存储元数据,请查询以下 INFORMATION_SCHEMA
视图:
INFORMATION_SCHEMA.TABLE_STORAGE
INFORMATION_SCHEMA.TABLE_STORAGE_BY_ORGANIZATION
INFORMATION_SCHEMA.TABLE_STORAGE_USAGE_TIMELINE
INFORMATION_SCHEMA.TABLE_STORAGE_USAGE_TIMELINE_BY_ORGANIZATION
对表数据进行聚簇
最佳做法:创建聚簇表。
如需优化查询存储,请先对表数据进行聚簇。通过对常用的列进行聚簇,您可以减少查询扫描的总数据量。如需了解如何创建聚簇,请参阅创建和使用聚簇表。
对表数据进行分区
最佳做法:使用分区划分大型表。
分区使您可以按一组定义的列特征(例如整数列、时间单位列或注入时间)对数据进行分组和排序。分区可减少查询读取的字节数,从而提高查询性能并控制费用。
如需详细了解分区,请参阅分区表简介。
使用表和分区到期时间设置
最佳做法:如需优化存储,请配置数据集、表和分区表的默认到期时间设置。
通过为数据集内新创建的表设置默认的表有效期,您可以控制存储费用,还可以优化存储空间使用情况。表到期后,系统会删除表及其包含的所有数据。如果您在创建数据集时设置该属性,则在有效期过后,系统会删除数据集内创建的所有已到期的表。如果您在创建数据集之后设置该属性,则在有效期过后,系统只会删除已到期的新表。
例如,如果您将默认的表有效期设置为 7 天,系统会在一周后自动删除较早的数据。
如果您只需访问最新数据,则此选项会非常有用。此外,如果您只是测试数据而无需保留数据,则此选项也会非常有用。
如果您按日期划分表,则数据集的默认表有效期将应用于各个分区。您还可以在 bq 命令行工具中使用 time_partitioning_expiration
标志或在 API 中使用 expirationMs
配置来控制分区到期时间。分区到期后,系统会删除分区中的数据,但不会删除分区表,即使该表为空也是如此。例如,以下命令会使分区在 3 天后过期:
bq mk \ --time_partitioning_type=DAY \ --time_partitioning_expiration=259200 \ project_id:dataset.table
使用 BigQuery 长期存储
最佳实践:使用 BigQuery 长期存储来降低旧数据的费用。
将数据加载到 BigQuery 存储空间后,系统会按照 BigQuery 存储价格对数据收费。您不必将较早的数据导出到其他存储选项(例如 Cloud Storage),而是可以利用 BigQuery 的长期存储价格这一优惠。
如果您的某个表连续 90 天未曾修改,则该表的存储价格会自动下降 50%。如果您有一个分区表,则每一个分区都会被视为单独的个体来判断是否适用长期存储价格,并遵循与非分区表相同的规则。
配置存储空间结算模式
最佳做法:根据您的使用模式优化存储空间结算模型。
BigQuery 支持按逻辑(未压缩)字节数或物理(压缩)字节数或者两者的组合来结算存储费用。为每个数据集配置的存储空间结算模式决定了存储价格,但不会影响查询性能。
您可以使用 INFORMATION_SCHEMA
视图根据您的使用模式确定最适合的存储结算模式。
确定长期或短期数据
最佳做法:确定是否需要长期存储行级数据,并且仅长期存储汇总数据。
在许多情况下,事务型数据或行级数据中包含的详细信息在短期内非常有用,但长期来看引用频率较低。在这些情况下,您可以构建汇总查询来计算和存储与此数据关联的指标,然后使用表或分区到期时间有系统地移除行级数据。这样可以降低存储费用,同时确保指标可供长期使用。
缩短时间旅行窗口
最佳做法:根据您的要求,您可以缩短时间旅行窗口。
将时间旅行窗口从默认值 7 天缩短,会缩短从表中删除或更改的数据的保留期限。只有在使用物理(压缩)存储结算模式时,您才需要为时间旅行存储付费。
时间旅行窗口在数据集级层设置。
将数据归档到 Cloud Storage
最佳做法:考虑将数据归档到 Cloud Storage 中。
您可以根据业务对归档的需求将数据从 BigQuery 迁移到 Cloud Storage。最佳做法是在从 BigQuery 导出数据之前考虑 BigQuery 长期价格。