BigQuery 存储概览
本页面介绍了 BigQuery 的存储组件。
BigQuery 存储空间针对针对大型数据集运行分析查询进行了优化。它还支持高吞吐量流式注入和高吞吐量读取。了解 BigQuery 存储可以帮助您优化工作负载。
概览
BigQuery 架构的一个关键功能是存储和计算相分离。这样,BigQuery 就可以根据需要独立扩缩存储和计算资源。
在运行查询时,查询引擎会将工作并行分配到多个工作器,这些工作器会扫描存储空间中的相关表、处理查询,然后收集结果。BigQuery 使用 PB 级网络在内存中完全执行查询,以确保数据极快地移动到工作器节点。
以下是 BigQuery 存储空间的一些主要功能:
托管式。BigQuery 存储是一项全托管式服务。您无需预配存储资源或预留存储单元。当您将数据加载到系统中时,BigQuery 会自动为您分配存储空间。您只需为所用的存储空间付费。BigQuery 价格模式针对计算和存储单独收费。如需详细了解价格,请参阅 BigQuery 价格。
耐用。BigQuery 存储旨在实现 99.999999999%(11 个 9)的年度耐用性。BigQuery 会跨多个可用性可用区复制数据,以防止因机器级故障或可用区故障导致数据而丢失。如需了解详情,请参阅“可靠性:灾难恢复规划”。
已加密。BigQuery 会在数据写入磁盘之前自动加密所有数据。您可以提供自己的加密密钥,也可以让 Google 管理加密密钥。如需了解详情,请参阅静态加密。
高效。BigQuery 存储空间使用针对分析工作负载进行优化的高效编码格式。如需详细了解 BigQuery 的存储格式,请参阅博文 Inside Capacitor,BigQuery 的下一代列式存储格式。
表数据
您在 BigQuery 中存储的大多数数据都是表数据。表数据包括标准表、表克隆、表快照和具体化视图。您需要为用于这些资源的存储空间付费。 如需了解详情,请参阅存储价格。
标准表包含结构化数据。每个表都有一个架构,架构中的每一列都具有一个数据类型。BigQuery 以列式格式存储数据。请参阅本文档中的存储布局。
表克隆是标准表的轻量级可写副本。BigQuery 仅存储表克隆与其基表之间的增量。
表快照是表的时间点副本。表快照是只读的,但您可以从表快照恢复表。BigQuery 仅存储表快照与其基表之间的增量。
具体化视图是预计算视图,可定期缓存视图查询结果。缓存的结果存储在 BigQuery 存储空间中。
此外,缓存的查询结果会存储为临时表。您无需为存储在临时表中的缓存查询结果付费。
外部表是一种特殊类型的表,其中数据位于 BigQuery 外部的数据存储区(例如 Cloud Storage)中。外部表具有表架构(与标准表类似),但表定义指向外部数据存储区。在这种情况下,只有表元数据会保留在 BigQuery 存储空间中。BigQuery 不对外部表存储收费,但外部数据存储区可能会针对存储收费。
BigQuery 将表和其他资源整理到逻辑容器中,称为数据集。如何对 BigQuery 资源进行分组会影响 BigQuery 工作负载的权限、配额、结算和其他方面。如需了解详情和最佳做法,请参阅整理 BigQuery 资源。
表所采用的数据保留政策取决于包含该表的数据集的配置。如需了解详情,请参阅使用时间旅行和故障安全功能保留数据。
元数据
BigQuery 存储空间还包含有关 BigQuery 资源的元数据。您无需为元数据存储付费。
当您在 BigQuery 中创建任何永久性实体(例如表、视图或用户定义的函数 (UDF))时,BigQuery 会存储有关该实体的元数据。即使对于不包含任何表数据的资源(例如 UDF 和逻辑视图),也是如此。
元数据包括表架构、分区和聚簇规范、表过期时间等信息。此类元数据对用户可见,可在创建资源时进行配置。此外,BigQuery 还会存储其在内部用于优化查询的元数据。此元数据不直接对用户可见。
存储布局
许多传统的数据库系统都采用面向行的格式存储数据,这意味着行会一起存储,并且每行中的字段在磁盘上按顺序显示。面向行的数据库可以高效地查找各个记录。但是,它们对许多记录执行分析函数效率较低,因为系统在访问记录时必须读取每个字段。
BigQuery 以列式格式存储表数据,这意味着它会分别存储每一列。在面向整个数据库扫描单个列时,面向列的数据库特别高效。
面向列的数据库针对针对大量记录聚合数据的分析工作负载进行了优化。通常,分析查询只需要从表中读取几列。例如,如果要计算数百万行的列数之和,BigQuery 可以读取该列数据,而无需读取每行的每个字段。
面向列的数据库的另一个优点是,列中的数据通常具有比跨行数据更多的冗余。此特性通过使用运行长度编码等技术来提高数据压缩性能,从而提高读取性能。
存储空间结算模式
您可以按逻辑字节数或物理(压缩)字节数或者两者的组合来为 BigQuery 数据存储空间付费。您选择的存储结算模式决定了存储价格。您选择的存储空间结算模式不会影响 BigQuery 性能。无论您选择哪种结算模式,您的数据都会以物理字节的形式存储。
您可以在数据集级层设置存储结算模式。如果您在创建数据集时未指定存储结算模式,则系统默认为使用逻辑存储结算。不过,您可以在创建数据集后更改数据集的存储结算模式。如果您更改了数据集的存储结算模式,则必须等待 14 天才能再次更改存储结算模式。
更改数据集的结算模式后,更改需要 24 小时才能生效。 更改数据集的结算模式时,长期存储中的任何表或表分区都不会重置为活跃存储。 更改数据集的结算模式不会影响查询性能和查询延迟时间。
数据集使用时间旅行和故障安全存储进行数据保留。如果您使用物理存储空间结算模式,系统会按活跃存储空间费率单独收取时间旅行和故障安全存储空间费用;但如果您使用逻辑存储空间结算模式,系统会将这两项费用计入基本费率中。您可以修改为数据集使用的时间旅行窗口,以在物理存储空间费用和数据保留之间实现平衡。您无法修改故障安全窗口。如需详细了解数据集数据保留,请参阅使用时间旅行和故障安全功能保留数据。如需详细了解如何预测存储费用,请参阅预测存储结算。
如果组织的任何现有旧版固定费率槽承诺位于数据集所在的区域,则无法将数据集加入物理存储空间结算。这不适用于通过 BigQuery 版本购买的承诺。
优化存储空间
优化 BigQuery 存储可以提高查询性能并控制费用。如需查看表存储元数据,请查询以下 INFORMATION_SCHEMA
视图:
如需了解如何优化存储,请参阅优化 BigQuery 存储。
加载数据
您可以通过多种基本模式将数据提取到 BigQuery 中。
批量加载:通过单个批量操作将源数据加载到 BigQuery 表中。这可以是一次性操作,也可以按时间表自动执行。批量加载操作可以创建新表或将数据附加到现有表中。
流式注入:持续流式注入较小批量的数据,以便可以近乎实时地查询数据。
生成的数据:使用 SQL 语句将行插入现有表中或将查询结果写入表中。
如需详细了解何时选择每种提取方法,请参阅加载数据简介。如需了解价格信息,请参阅数据提取价格。
从 BigQuery 存储空间读取数据
大多数情况下,您将数据存储在 BigQuery 中,以便对该数据运行分析查询。但是,有时您可能希望直接从表中读取记录。BigQuery 提供了多种读取表数据的方法:
BigQuery API:使用
tabledata.list
方法进行同步分页访问。数据以串行方式读取,每次调用一页。 如需了解详情,请参阅浏览表数据。BigQuery Storage API:这是一种流式高吞吐量访问,此外还支持服务器端列投影和过滤。通过将读取操作细分为多个不相交的流,可以在多个读取器之间并行执行读取操作。
导出:使用提取作业或
EXPORT DATA
语句以高吞吐量异步复制到 Google Cloud Storage。如果您需要复制 Cloud Storage 中的数据,请使用提取作业或EXPORT DATA
语句导出数据。复制:在 BigQuery 中异步复制数据集。当来源和目标位置相同时,复制将以相应的逻辑方式完成。
如需了解价格信息,请参阅数据提取价格。
根据应用要求,您可以读取表数据:
- 读取和复制:如果您需要 Cloud Storage 中的静态副本,请使用提取作业或
EXPORT DATA
语句导出数据。如果您只想读取数据,请使用 BigQuery Storage API。如果要在 BigQuery 中创建副本,请使用复制作业。 - 规模:BigQuery API 是效率最低的方法,不应该用于大容量读取。如果您需要每天导出 50 TB 以上的数据,请使用
EXPORT DATA
语句或 BigQuery Storage API。 - 返回第一行的时间:BigQuery API 是返回第一行的最快方法,但应该仅用于读取少量数据。BigQuery Storage API 返回第一行的速度较慢,但吞吐量要高得多。导出和复制必须在读取任何行之前完成,因此对于这些类型的作业,第一行数据的读取时间可能为几分钟。
删除
当您删除表时,数据至少会在时间旅行窗口的持续时间内保留。此后,系统会在 Google Cloud 删除时间表内从磁盘中清理数据。某些删除操作(例如 DROP COLUMN
语句)是仅针对元数据的操作。在这种情况下,系统会在您下次修改受影响的行时释放存储空间。如果您不修改表,则无法保证释放存储空间的时间。如需了解详情,请参阅 Google Cloud 上的数据删除。
后续步骤
- 了解使用表。
- 了解如何优化存储。
- 了解如何在 BigQuery 中查询数据。
- 了解数据安全和治理。