具体化视图简介
本文档简要介绍 BigQuery 对具体化视图的支持。在阅读本文档之前,请先熟悉 BigQuery 和 BigQuery 的逻辑视图。
概览
在 BigQuery 中,具体化视图是预计算视图,可定期缓存查询结果以提高性能和效率。BigQuery 利用来自具体化视图的预计算结果,并尽可能只从基表中读取更改以计算最新结果。具体化视图可以直接进行查询,也可以由 BigQuery 优化器用来处理对基表的查询。
使用具体化视图的查询,较之仅从基表中检索相同数据的查询相比,通常速度更快,消耗的资源更少。具体化视图可显著提升以常见查询和重复查询为特征的工作负载的性能。
以下是具体化视图的主要特征:
- 零维护。当基表发生变化时,系统会在后台预计算具体化视图。基表中的任何增量数据更改都会自动添加到具体化视图,无需用户执行任何操作。
- 最新数据。具体化视图会返回最新数据。如果对基表的更改可能会使物化视图无效,则系统会直接从基表中读取数据。如果对基表的更改不会使物化视图无效,则系统会从物化视图中读取其余数据,而仅从基表中读取更改。
- 智能调整。 如果针对基表的查询的任何部分可以通过查询物化视图来解析,则 BigQuery 会重新路由查询以使用物化视图来提高性能和效率。
使用场景
具体化视图可以优化计算费用高、数据集结果小的查询。可从具体化视图获益的过程包括在线分析处理 (OLAP) 操作,这些操作需要含有可预测和重复的查询(如提取、转换和加载 (ETL) 过程或商业智能 (BI) 流水线中的查询)的大量处理。
以下使用场景重点介绍了具体化视图的价值。如果您经常需要下列各项,则具体化视图可以提高查询性能:
- 预汇总数据。聚合流式传输数据。
- 预过滤数据。运行只读取表的特定部分的查询。
- 预联接数据。查询联接,尤其是大型表和小型表之间的联接。
- 重新聚簇数据。运行可从与基表不同的聚簇方案获益的查询。
与其他 BigQuery 技术进行比较
下表汇总了 BigQuery 缓存、计划查询、逻辑视图和具体化视图之间的相似之处和区别。
组件 | 缓存 | 计划查询 | 逻辑视图 | 具体化视图 |
---|---|---|---|---|
优化计算 | 是 | 否 | 否 | 是 |
查询支持 | 全部 | 全部 | 全部 | 受限制1 |
分区和聚簇 | 否 | 是 | 不适用 | 是 |
增量刷新 | 否 | 否 | 否 | 是 |
额外的存储空间 | 否 | 是 | 否 | 是 |
查询重写 | 否 | 否 | 否 | 是 |
维护费用 | 否 | 是 | 不适用 | 是 |
数据过时 | 从不 | 是 | 永不 | 可选 2 |
1 --allow_non_incremental_definition
选项支持扩展的 SQL 查询范围,以创建具体化视图。
2 在处理频繁更改的大型数据集时,--max_staleness
选项能够以可控的成本实现始终如一的高性能。
与其他 BigQuery 功能进行交互
以下 BigQuery 功能可以透明地处理具体化视图:
查询计划说明:查询计划反映了扫描的具体化视图(如果有),并显示从具体化视图和基表读取的总字节数。
查询缓存:BigQuery 使用物化视图重写的查询结果是否可以缓存受到常规限制(使用确定性函数、无需流式插入到基表等)。
费用限制:如果您设置了计费的字节数上限值,并且查询读取的字节数超出了上限,则查询会失败,但不会产生费用,无论查询是否使用了具体化视图和/或基表。
通过试运行估算费用:试运行通过可用的具体化视图来重复执行查询重写逻辑,并提供费用估算。您可以将此功能用作测试特定查询是否使用任何具体化视图的方法。
启用了 BigLake 元数据缓存的表
启用了 BigLake 元数据缓存的表的具体化视图可以引用 Cloud Storage 和 Amazon Simple Storage Service (Amazon S3)中存储的结构化数据。这些具体化视图的功能与 BigQuery 管理的存储表的具体化视图一样,包括自动刷新和智能调整的优势。其他优势包括预聚合、预过滤和预联接在 BigQuery 外部存储的数据。BigLake 表的具体化视图存储在 BigQuery 托管式存储空间中,并且具有该存储空间的所有特征。
创建 Amazon S3 BigLake 表的物化视图时,该物化视图中的数据不可用于与 BigQuery 数据联接。如需使物化视图中的 Amazon S3 数据可用于联接,请创建物化视图的副本。您只能基于已获授权的物化视图创建物化视图副本。
物化视图副本
BigQuery 可让您基于 Amazon Simple Storage Service (Amazon S3) 数据在启用了 BigLake 元数据缓存的表上创建具体化视图。
物化视图副本让您可在查询中使用 Amazon S3 物化视图数据,同时避免数据出站流量费用并提高查询性能。为此,物化视图副本会将 Amazon S3 数据复制到受支持的 BigQuery 区域中的数据集,以便在 BigQuery 中本地提供数据。
了解如何创建物化视图副本。
数据新鲜度
创建物化视图副本后,复制过程将轮询来源物化视图以查看是否发生更改,并将数据复制到物化视图副本。数据会按照您在 CREATE MATERIALIZED VIEW AS REPLICA OF
语句的 replication_interval_seconds
选项中指定的时间间隔进行复制。
除了复制间隔时间之外,物化视图副本数据的新鲜度还会受到来源物化视图的刷新频率以及物化视图使用的 Amazon S3 表的元数据缓存的刷新频率影响。
您可以使用 Google Cloud 控制台查看物化视图副本及其所基于的资源的数据新鲜度:
- 如需了解物化视图副本的新鲜度,请查看物化视图副本的详细信息窗格中的上次修改时间字段。
- 如需了解来源物化视图的新鲜度,请查看物化视图的详细信息窗格中的上次修改时间字段。
- 如需了解来源 Amazon S3 表元数据缓存的新鲜度,请查看具体化视图的详细信息窗格中的最长过时期限字段。
支持的区域
创建具体化视图副本时,请使用下表中的位置映射:
来源具体化视图的位置 | 物化视图副本的位置 |
---|---|
aws-us-east-1 |
US 多区域,或是以下任何区域:
|
aws-us-west-2 |
US 多区域,或是以下任何区域:
|
aws-eu-west-1 |
EU 多区域,或是以下任何区域:
|
aws-ap-northeast-2 |
以下任何区域:
|
aws-ap-southeast-2 |
以下任何区域:
|
限制
- 可能存在基表引用方面的限制和其他限制。如需详细了解物化视图限制,请参阅配额和限制。
- 无法直接使用
COPY
、EXPORT
、LOAD
、WRITE
或数据操纵语言 (DML) 语句等操作更新或操纵物化视图的数据。 - 不能将现有的物化视图替换为同名的物化视图。
- 创建物化视图后,无法更新视图 SQL。
- 物化视图必须与基表位于同一组织中,或者如果项目不属于组织,则位于同一项目中。
- 智能调整只考虑来自同一数据集的具体化视图。
- 具体化视图支持受限 SQL 语法和数量有限的一组聚合函数。如需了解详情,请参阅支持的具体化视图。
- 具体化视图不能嵌套在其他具体化视图上。
- 具体化视图无法查询外部表或通配符表、逻辑视图1、快照,或已启用变更数据捕获的表。
- 具体化视图仅支持 GoogleSQL 方言。
- 您可以为物化视图设置说明,但无法为物化视图中的各个列设置说明。
- 如果在未先删除物化视图的情况下删除基表,则物化视图的查询和刷新会失败。如果您重新创建基表,则还必须重新创建物化视图。
1逻辑视图参考支持目前为预览版。如需了解详情,请参阅参考逻辑视图。
对 BigLake 表的具体化视图的限制
- 不支持对物化视图进行分区。基表可以使用 Hive 分区,但物化视图存储空间无法在 BigLake 表中分区。这意味着基表中的任何删除都会导致物化视图完全刷新。如需了解详情,请参阅增量更新。
- 物化视图的
-max_staleness
选项值必须大于 BigLake 基表的该选项值。 - 单个物化视图定义不支持 BigQuery 托管式表和 BigLake 表之间的联接。
物化视图副本的限制
- 您无法为基于使用行级层安全性或列级层安全性的表的具体化视图创建具体化视图副本。
- 您无法将客户管理的加密密钥 (CMEK) 与来源物化视图或物化视图副本搭配使用。
- 您只能为基于使用元数据缓存的表的物化视图创建物化视图副本。
- 您只能为一个给定的来源物化视图创建一个物化视图副本。
- 您只能为已获授权的物化视图创建物化视图副本。
具体化视图价格
费用与具体化视图的以下几个方面相关联:
- 查询具体化视图。
- 维护具体化视图,例如在刷新具体化视图时。自动刷新的费用会计入视图所在的项目。手动刷新的费用会计入运行手动刷新作业的项目。如需详细了解如何控制维护费用,请参阅刷新作业维护。
- 存储物化视图表。
组件 | 按需价格 | 基于容量的价格 |
---|---|---|
查询 | 由具体化视图和基表的任意必要部分处理的字节数。1 | 查询期间会用到槽。 |
维护 | 刷新期间处理的字节数。 | 刷新期间使用的槽数。 |
存储 | 具体化视图中存储的字节数。 | 具体化视图中存储的字节数。 |
1如果可能,BigQuery 仅读取自从上次刷新视图以来所做的更改。如需了解详情,请参阅增量更新。
存储费用详情
对于物化视图中的 AVG
、ARRAY_AGG
和 APPROX_COUNT_DISTINCT
聚合值,系统不会直接存储最终值。而是 BigQuery 在内部将物化视图存储为用于生成最终值的中间草图。
例如,考虑一个使用以下命令创建的物化视图:
CREATE MATERIALIZED VIEW project-id.my_dataset.my_mv_table AS SELECT date, AVG(net_paid) AS avg_paid FROM project-id.my_dataset.my_base_table GROUP BY date
虽然 avg_paid
列以 NUMERIC
或 FLOAT64
形式呈现给用户,但它在内部存储为 BYTES
,其内容是采用专有格式的中间草图。对于数据大小计算,该列被视为 BYTES
。
物化视图副本费用
使用物化视图副本会产生计算、出站数据传输和存储费用。