在数据库系统中,物化视图作为数据库对象将查询的预先计算结果存储为物理表。由于数据实际上存储在磁盘上,因此可以更快地检索复杂的搜索。然而,视图是一个虚拟表,它定义查询但实际上并不保存数据。每当您查询视图时,视图都会从基础基表中提取最新信息。实时数据访问与预先计算的结果是确定是使用物化视图还是标准视图的一些标准。
什么是物化视图?
物化视图在数据库中物理存储 SQL 查询的结果。存储的数据可以按指定的时间间隔(手动、定期或自动)刷新,以保持视图随着底层基表的变化而调整。
物化视图如何工作?
假设您想要执行一个复杂的 SQL 查询来汇总多个区域的销售数据。您不必每次生成报告时都执行复杂的查询,而是创建一个物化视图来预先计算和存储结果。当用户想要查看报告时,它可以直接从物化视图中检索,而不必在计算机程序运行期间重新计算聚合,而无需中断运行。
物化视图的常见用例
- 预计算聚合: 物化视图非常适合报告和分析。它预先计算并存储聚合数据,以便不需要一次又一次执行耗时的查询。
- 减少复杂连接期间的负载: 当数据库包含多个复杂连接时,创建物化视图是为了在查询执行期间连接表并存储结果。
- 缓存经常访问的数据: 物化视图充当保存结果的缓存,提高查询性能并减少基表的负载。
什么是视图?
视图是一个虚拟表,本身不存储数据。每当访问视图以形成最新结果时,都会对基表执行多次查询。
视图如何工作?
假设您有很多基表,保存来自不同地区的客户信息。每次需要查看整合的客户数据时,您都可以创建一个视图,而不是编写复杂的 SQL 查询。然后,当您查询视图时,它会通过动态连接基表来检索和显示数据。
View 的常见用例
- 简化复杂查询: View 可以将一系列复杂的联接和过滤器封装到一个虚拟表中,从而使最终用户能够更轻松地访问数据。
- 提高安全性: 通过定义视图仅显示某些列或行,可以通过隐藏底层数据来限制对敏感数据访问的了解。
- 创建抽象层: 您可以使用视图在多个表上提供抽象层,从而更轻松地理解和管理数据,而无需干扰原始基表。
物化视图与视图的优缺点
在物化视图和视图之间进行选择需要理解其中的折衷方案。以下是每种方法的详细优缺点。
物化视图的优点和缺点
| 方面 | 优点 | 缺点 |
| 表现 | 通过保留预先计算的结果来提高性能 | 如果不更新,就会变得陈旧 |
| 速度 | 减少复杂查询所花费的时间 | 为了保留视图,需要更多存储空间 |
| 新鲜 | 可以定期更新 | 除非更新,否则数据并不总是最新的 |
| 资源使用情况 | 对于重复查询,使用较少的CPU和内存 | 需要额外的资源用于维护和存储 |
| 灵活性 | 有利于分析和报告等案例 | 对于需要新数据的实时应用程序来说不是最佳选择 |
| 维护 | 可以自动更新(增量或全部) | 对于大型数据库,刷新成本可能很高 |
| 复杂查询 | 帮助最终用户理解复杂的查询 | 需要刷新视图才能更新基础表 |
| 并发性 | 通过缓存结果,数据库的负载减少 | 高刷新率会影响数据库性能 |
视图的优点和缺点
| 方面 | 优点 | 缺点 |
| 表现 | 对于简化数据访问很有用 | 如果查询涉及多个联接或聚合,则速度会变慢 |
| 速度 | 实时数据获取最新信息,无延迟 | 查询速度较慢,特别是当视图很复杂时 |
| 新鲜 | 始终与基础表保持同步 | 复杂查询可能导致性能不佳 |
| 资源使用情况 | 它不需要更多的存储空间,因为它只保留查询的定义 | 每个执行查询都会重新计算结果 |
| 灵活性 | 在查询中可以将其视为普通表 | 不适合注重性能的分析 |
| 维护 | 无需刷新,自动获取实时数据 | 使用大型数据集频繁访问时性能可能会下降 |
| 复杂查询 | 提供结构化抽象,使查询逻辑更容易 | 预先计算的结果不能像物化视图一样存储 |
| 并发性 | 它始终显示基础表中的实时变化 | 重负载可能会给数据库带来额外的负担 |
视图和物化视图之间的主要区别
现代应用程序依赖数据库作为主干,对数据的控制是通过两个关键工具来完成的:物化视图和视图。它们的存在主要是为了简化数据访问和优化查询性能,但是它们的目的有所不同。以下是物化视图和视图之间的一些区别特征。
贮存
- 物化视图: 将实际数据存储在数据库中。
- View:不存储数据; 仅存储查询定义。
查询执行
- 物化视图: 获取预先计算的数据,从而提高查询性能。
- 看法: 每次访问都会启动查询执行。
数据新鲜度
- 物化视图: 除非显式刷新,否则数据可能会过时。
- 看法: 它始终从基础表中获取最新数据。
表现
- 物化视图: 由于之前计算的数据已被存储,因此速度更快。
- 看法: 如果查询很复杂,它可能会更慢,因为它是按需的。
刷新机制
- 物化视图: 它需要手动或计划刷新来更新内容。
- 看法: 无需刷新,因为始终获取实时数据。
存储要求
- 物化视图: 需要一些额外的存储来维护预先计算的结果。
- 看法: 除了查询元数据之外,基本上不使用任何存储。
使用案例
- 物化视图: 适合报告、分析和性能要求较高的查询。
- 看法: 当必须接近实时数据时,这是一个选项。
复杂
- 物化视图: 需要维护和更新管理。
- 看法: 设置和使用简单,但可能会占用大量资源。
何时使用物化视图与视图
在以下情况下使用物化视图:
当必须不惜一切代价提高查询性能时,尤其是当此类查询在返回大量聚合、连接或处理操作的结果之前涉及大量计算时,物化视图就出现了。当预先计算的结果对数据库施加的负载或查询返回结果的速度产生巨大差异时,它会特别有用。尽管物化视图需要定期刷新才能获取最新更新的数据,但它们在报告和分析场景中发挥着作用,在这些场景中,实时数据访问并不那么重要,但快速执行仍然很重要。
在以下情况下使用视图:
使用查询应始终获取最新数据的视图,其中数据访问必须是实时的,并且可以管理查询复杂性,并记住视图不会将数据物理存储在数据库中,因此需要较低的存储空间。但是,请记住,对于非常复杂的查询,视图在执行多次时可能会降低系统速度。
结论
在调整数据库性能时,物化视图与常规视图的不同是一个重要概念。物化视图是存储预先计算的结果以加速繁重操作的查询的视图;然而,它们在维护方面可能会很麻烦,因为如果不及时更新它们可能会变得陈旧。相反,视图会针对基础基表的更改进行更新,以实现实时准确性,尽管它们可能会降低一些性能。
在选择它们时,请考虑您的数据库工作负载、查询的复杂性以及实时数据的重要性。对于性能优先的报告或分析,物化视图是一个强有力的选择。相反,对于最新数据很重要的场景,常规视图是可取的。
最终决定还可能取决于所使用的数据库系统。不同的数据库系统,包括 PostgreSQL, 甲骨文, 和 MySQL 具有不同级别的物化视图支持和功能。