BigQuery 存储概览

本页面介绍了 BigQuery 的存储组件。

BigQuery 存储空间针对针对大型数据集运行分析查询进行了优化。它还支持高吞吐量流式提取和高吞吐量读取。了解 BigQuery 存储可以帮助您优化工作负载。

概览

BigQuery 架构的一个关键功能是存储和计算相分离。这样,BigQuery 就可以根据需要独立扩缩存储和计算资源。

BigQuery 架构
图 1.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 还会存储其在内部用于优化查询的元数据。此元数据不直接对用户可见。

存储布局

许多传统的数据库系统都采用面向行的格式存储数据,这意味着行会一起存储,并且每行中的字段在磁盘上按顺序显示。面向行的数据库可以高效地查找各个记录。但是,它们对许多记录执行分析函数效率较低,因为系统在访问记录时必须读取每个字段。

面向行的格式
图 2.面向行的格式。

BigQuery 以列式格式存储表数据,这意味着它会分别存储每一列。在面向整个数据库扫描单个列时,面向列的数据库特别高效。

面向列的数据库针对针对大量记录聚合数据的分析工作负载进行了优化。通常,分析查询只需要从表中读取几列。例如,如果要计算数百万行的列数之和,BigQuery 可以读取该列数据,而无需读取每行的每个字段。

面向列的数据库的另一个优点是,列中的数据通常具有比跨行数据更多的冗余。此特性通过使用运行长度编码等技术来提高数据压缩性能,从而提高读取性能。

面向列的格式
图 3.面向列的格式。

优化存储空间

优化 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 上的数据删除

后续步骤