什么是实体化视图?
实体化视图是通过合并来自多个现有表的数据创建的重复数据表,目的是加快数据检索。例如,一个零售应用程序有两个基表,分别用于客户和产品数据。客户表包含客户姓名和联系方式等信息,产品表则包含产品详细信息和成本相关信息。客户表仅存储单个客户采购商品的产品 ID。您必须交叉参考这两个表才能获得特定客户购买商品的产品详细信息。但您也可以创建一个实体化视图,将客户名称和相关产品的详细信息存储在一个临时表中。您可以在实体化视图上构建索引结构,以提升数据读取性能。
实体化视图有哪些优点?
实体化视图是访问相关数据的一种快速而有效的方法。该功能有助于在数据密集型应用程序中优化查询。接下来我们将介绍一些主要的优点。
速度
读取查询扫描不同的表和数据行以收集必要的信息。使用实体化视图,您可以直接从新视图查询数据,而不必每次都计算新信息。查询越复杂,使用实体化视图节省的时间就越多。
数据存储简便性
实体化视图允许您将复杂的查询逻辑合并到一个表中。这使得开发人员可以更轻松地进行数据转换和代码维护。这样还有助于使复杂查询更易于管理。您还可以使用数据子集来减少需要在视图中复制的数据量。
一致性
实体化视图提供在特定时刻捕获的数据的一致视图。您可以在实体化视图中配置读取一致性,即使在并发性控制至关重要的多用户环境中也可以访问数据。
即使源数据发生变化或遭删除,实体化视图也提供数据访问权限。这意味着,随着时间的推移,您可以使用实体化视图来报告基于时间的数据快照。与源表的隔离级别可确保您的数据具有更高的一致性。
改进访问控制
您可以使用实体化视图来控制谁有权访问特定数据。您还能为用户筛选信息,而无需授予他们对源表的访问权限。如果您想要控制谁有权访问哪些数据,以及他们可以查看和交互的数据量,这种方法非常管用。
实体化视图的用例有哪些?
在许多不同的场景中,您可以从实体化视图中受益。
分发筛选的数据
如果您需要在多个地点分发最新数据(例如远程工作人员),实体化视图会有所帮助。您可以使用实体化视图将数据复制和分发到许多站点。需要访问数据的人员与地理位置最接近的复制数据存储进行交互。
此系统允许并发,并降低网络负载。对于只读数据库,这是一种有效的方法。
分析时间序列数据
实体化视图提供数据集的时间戳快照,因此您可以随时间推移对信息更改建模。您可以存储预计算的数据聚合,如每月或每周摘要。这些用途对商业智能和报告平台很有帮助。
远程数据交互
在分布式数据库系统中,您可以使用实体化视图来优化涉及远程服务器数据的查询。您可以在本地实体化视图中获取和存储数据,而不是从远程源重复获取数据。这样就能减少对网络通信的需求并提高了性能。
例如,如果您从外部数据库或通过 API 接收数据,则实体化视图将整合并帮助进行处理。
定期批处理
在需要定期进行批处理的情况下,实体化视图显得十分有用。例如,金融机构可以使用实体化视图来存储日末余额和利息计算。或者,金融机构可以存储产品组合性能摘要,这些摘要可以在每个工作日结束时更新。
实体化视图是如何工作的?
实体化视图的工作原理是预先计算特定查询的结果,并将其作为物理表存储在数据库中。数据库定期执行预计算,用户也可以通过特定事件触发预计算。管理员监控实体化视图的性能和资源利用率,以确保继续实现预期目的。
以下是实体化视图工作原理的概述。
创建实体化视图
您可以定义一个查询,用于从一个或多个源表中检索所需数据,以创建实体化视图。此查询可能包括筛选、聚合、联接和其他需要的操作。
数据库最初通过对源数据运行定义的查询来填充实体化视图。查询的结果以物理表的形式存储在数据库中,该表表示实体化视图。
更新实体化视图
需要定期更新实体化视图中的数据,以反映源表中基础数据的变化。数据刷新频率取决于用例和要求。
接下来,我们将介绍几种常用的数据刷新方法。
完全刷新
实体化视图已完全重新计算,并被最新的查询结果覆盖。这是最简单的方法,但可能占用大量资源,特别是对于大型实体化视图而言。
增量刷新
只有基础数据的更改才会应用于实体化视图。在处理大型数据集和频繁更新时,这比完全更新更高效。
按需刷新
某些系统允许按需刷新实体化视图,由特定事件或用户请求触发。这样可以更好地控制何时更新数据,但需要仔细管理以确保实体化视图保持最新。
不同系统的技术差异
每个数据库管理系统都有不同的方法来创建实体化视图。
数据库管理系统 |
实体化视图的工作原理 |
PostgreSQL |
使用 PostgreSQL,您必须手动刷新实体化视图,重新计算整个视图。您可以在创建实体化视图时使用数据进行填充。 |
MySQL |
MySQL 不支持实体化视图。 |
Oracle |
Oracle 会自动刷新实体化视图,但您也可以选择按需刷新。您也可以编写一条 SQL 语句,在交付结果之前提示视图刷新。 |
SQL Server |
SQL Server 使用名称“索引视图”,因为实体化是创建常规视图索引的一个步骤。您只能使用其索引视图执行基本 SQL 查询。它们会自动为用户更新。 |
MongoDB |
MongoDB 使用聚合函数为 NoSQL 环境提供与实体化视图类似的功能。 |
普通视图和实体化视图有什么区别?
在关系数据库中,视图是通过转换和合并多个基表中的数据而创建的临时表。视图是一个虚拟表,本身不存储任何数据。但它是通过对一个或多个源表的查询来定义的。
每当用户查询视图时,数据库引擎都会通过对源表运行基础查询来动态计算结果。视图中的数据始终是最新的,因为每次访问时都直接从源表派生。
另一方面,实体化视图将特定查询的结果作为物理表存储在数据库中。实体化视图中的数据是预先计算并存储的,这意味着结果已经可用,而无需在每次访问视图时重新计算查询。
但是,实体化视图中的数据并不总是最新的。您必须配置更新频率,以平衡数据的更新程度和查询性能。
实体化视图面临哪些挑战?
由于实体化视图是需要考虑的另一个数据库组件,因此在维护方面会增加另一层复杂性。您必须在查询和效率优势与潜在的存储成本和数据一致性问题之间取得平衡。
您必须创建有效的规则来触发更新,以确保您的实体化视图仍然有用。频繁更新实体化视图可能会影响系统性能,尤其是在您已经处于高峰期的情况下。此外,实体化视图在复制数据时还会占用大量空间。如果您有一个不断更新的大型数据库,则实体化视图的存储需求可能非常大。
如果要使用实体化视图,则需要设置清晰的刷新规则和计划。您还必须了解如何处理数据不一致、刷新失败和增加的存储压力。
AWS 如何帮助您满足实体化视图需求?
在 Amazon Redshift 中,实体化视图是提高查询性能的强大工具。
Amazon Redshift 使用机器学习持续监控工作负载,并在有益时创建新的实体化视图。Redshift 中的自动实体化视图(AutoMV)功能提供的性能优势与用户创建的实体化视图相同。
AutoMV 功能可以在很多方面使您受益:
- 在创建实体化视图和保持最新状态的成本与查询延迟的预期收益之间取得平衡
- 监控之前创建的 AutoMV,并在它们不再有益时予以删除
- 使用与用户创建的实体化视图相同的标准和限制,以增量方式自动刷新
此外,开发人员无需修改查询即可利用 AutoMV。使用实体化视图自动重写查询可识别可从系统创建的 AutoMV 中受益的查询。该功能会自动重写这些查询以使用 AutoMV,从而提高查询效率。
立即创建账户,开始在 AWS 上使用实体化视图。