具体化视图简介
物化视图是预计算视图,可定期存储 SQL 查询的结果。物化视图可以通过存储查询结果来减少与查询相关的总处理时间和费用,从而减少针对每个查询扫描的数据量。BigQuery 会通过在后台计算更新来验证物化视图是否提供最新数据。此过程通过仅使用基表中的更改数据以增量方式执行,但需考虑多项因素。 物化视图可以直接进行查询,也可以由 BigQuery 用来优化对其基表的查询。
物化视图的主要特征包括:
- 零维护。当基表发生变化时,系统会在后台预计算具体化视图。基表中的任何增量数据更改都会自动添加到具体化视图,无需用户执行任何操作。
- 最新数据。具体化视图会返回最新数据。如果对基表的更改可能会使物化视图无效,则系统会直接从基表中读取数据。如果对基表的更改不会使物化视图无效,则系统会从物化视图中读取其余数据,而仅从基表中读取更改。
- 智能调整。 如果针对基表的查询的任何部分可以通过查询物化视图来解析,则 BigQuery 会重新路由查询以使用物化视图来提高性能和效率。
与逻辑视图的比较
下表汇总了 BigQuery 逻辑视图和具体化视图之间的相似之处和区别。
组件 | 逻辑视图 | 具体化视图 |
---|---|---|
优化计算 | 否 | 是 |
查询支持 | 全部 | 受限制1 |
分区和聚簇 | 不适用 | 是 |
增量刷新 | 否 | 是 |
额外的存储空间 | 否 | 是 |
查询重写 | 否 | 是 |
维护费用 | 否 | 是 |
数据过时 | 永不 | 可选 2 |
1 --allow_non_incremental_definition
选项支持扩展的 SQL 查询范围,以创建具体化视图。
2 在处理频繁更改的大型数据集时,--max_staleness
选项能够以可控的成本实现始终如一的高性能。
使用场景
具体化视图可以优化计算费用高、数据集结果小的查询。可从具体化视图获益的过程包括在线分析处理 (OLAP) 操作,这些操作需要含有可预测和重复的查询(如提取、转换和加载 (ETL) 过程或商业智能 (BI) 流水线中的查询)的大量处理。
以下使用场景重点介绍了具体化视图的价值。如果您经常需要下列各项,则具体化视图可以提高查询性能:
- 预汇总数据。聚合流式传输数据。
- 预过滤数据。运行只读取表的特定部分的查询。
- 预联接数据。查询联接,尤其是大型表和小型表之间的联接。
- 重新聚簇数据。运行可从与基表不同的聚簇方案获益的查询。
智能调整
物化视图可用于在不修改查询的情况下以透明方式提高查询性能。您可以使用具体化视图来优化具有常见模式的查询集,例如由 BI 工具生成的查询集。如需了解详情,请参阅使用物化视图。
授权物化视图
您可以创建已获授权的物化视图,以便将源数据集中的部分数据共享到次要数据集中的视图。然后,您可以将此视图共享给可以查看您共享的数据的特定用户和群组(主账号)。主账号可以查询您在视图中提供的数据,但无法直接访问源数据集。
授权视图和授权物化视图以相同的方式获得授权。如需了解详情,请参阅授权视图。
与其他 BigQuery 功能进行交互
以下 BigQuery 功能可以透明地处理具体化视图:
查询计划说明:查询计划反映了扫描的具体化视图(如果有),并显示从具体化视图和基表读取的总字节数。
查询缓存:BigQuery 使用物化视图重写的查询结果是否可以缓存受到常规限制(使用确定性函数、无需流式插入到基表等)。
费用限制:如果您设置了计费的字节数上限值,并且查询读取的字节数超出了上限,则查询会失败,但不会产生费用,无论查询是否使用了具体化视图和/或基表。
通过试运行估算费用:试运行通过可用的具体化视图来重复执行查询重写逻辑,并提供费用估算。您可以将此功能用作测试特定查询是否使用任何具体化视图的方法。
启用了 BigLake 元数据缓存的表
启用了 BigLake 元数据缓存的表的具体化视图可以引用 Cloud Storage 和 Amazon Simple Storage Service (Amazon S3)中存储的结构化数据。这些具体化视图的功能与 BigQuery 管理的存储表的具体化视图一样,包括自动刷新和智能调整的优势。其他优势包括预聚合、预过滤和预联接在 BigQuery 外部存储的数据。BigLake 表的具体化视图存储在 BigQuery 托管式存储空间中,并且具有该存储空间的所有特征。
创建 Amazon S3 BigLake 表的物化视图时,该物化视图中的数据不可用于与 BigQuery 数据联接。如需使物化视图中的 Amazon S3 数据可用于联接,请创建物化视图的副本。您只能基于授权物化视图创建物化视图副本。
限制
- 可能存在基表引用方面的限制和其他限制。如需详细了解物化视图限制,请参阅配额和限制。
- 无法直接使用
COPY
、EXPORT
、LOAD
、WRITE
或数据操纵语言 (DML) 语句等操作更新或操纵物化视图的数据。 - 不能将现有的物化视图替换为同名的物化视图。
- 创建物化视图后,无法更新视图 SQL。
- 物化视图必须与基表位于同一组织中,或者如果项目不属于组织,则位于同一项目中。
- 具体化视图支持受限 SQL 语法和数量有限的一组聚合函数。如需了解详情,请参阅支持的具体化视图。
- 具体化视图不能嵌套在其他具体化视图上。
- 物化视图无法查询外部表或通配符表、逻辑视图1或快照。
- 具体化视图仅支持 GoogleSQL 方言。
- 您可以为物化视图设置说明,但无法为物化视图中的各个列设置说明。
- 如果在未先删除物化视图的情况下删除基表,则物化视图的查询和刷新会失败。如果您重新创建基表,则还必须重新创建物化视图。
- 如果物化视图具有启用了变更数据捕获的基表,则该表不能在与物化视图相同的查询中引用。
1逻辑视图参考支持目前为预览版。如需了解详情,请参阅参考逻辑视图。
对 BigLake 表的具体化视图的限制
- 不支持对物化视图进行分区。基表可以使用 Hive 分区,但物化视图存储空间无法在 BigLake 表中分区。这意味着基表中的任何删除都会导致物化视图完全刷新。如需了解详情,请参阅增量更新。
- 物化视图的
-max_staleness
选项值必须大于 BigLake 基表的该选项值。 - 单个物化视图定义不支持 BigQuery 托管式表和 BigLake 表之间的联接。
- BigQuery BI Engine 不支持通过 BigLake 表加速物化视图。
具体化视图价格
费用与具体化视图的以下几个方面相关联:
- 查询具体化视图。
- 维护具体化视图,例如在刷新具体化视图时。自动刷新的费用会计入视图所在的项目。手动刷新的费用会计入运行手动刷新作业的项目。如需详细了解如何控制维护费用,请参阅刷新作业维护。
- 存储物化视图表。
组件 | 按需价格 | 基于容量的价格 |
---|---|---|
查询 | 由具体化视图和基表的任意必要部分处理的字节数。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
。