视图 VS 物化视图

Views VS Materialized Views

View 和 Materialized View 之间的实际区别是什么?

我浏览了很多链接,他们说普通视图就像虚拟视图 table 并且数据不能存储在磁盘上,以防物化数据存储在磁盘上。但是从那里我什么时候使用普通视图以及什么时候使用实体化视图。如果我创建了我可以在我的架构中看到的两个视图。我想知道我们使用普通视图和使用物化视图的确切时间和地点。请给我提供实际例子的解决方案。

谢谢

视图只是一个存储的查询。这是保存一些复杂业务逻辑(连接、过滤器、派生值)的便捷方式,因此可以重复使用并与其他用户共享。

实体化视图也是一种保存查询的方式,但它具体化了结果集。也就是说,它会在磁盘上创建数据的副本。

使用实体化视图的主要原因是提高了性能。每次我们从一个视图 select 执行整个查询;如果这是一个昂贵的查询,那是我们每次都要支付的费用。通过物化视图,我们用磁盘 space 换取时间。

此外,我们可以像 table 一样对待实体化视图:我们可以为它们建立索引,我们可以添加键约束,我们甚至可以在外键中引用它们。

不使用物化视图的主要原因是成本。他们占用磁盘space。它们也必须得到维护。默认情况下,物化视图是静态的,这意味着它们的数据会随着时间的推移逐渐变得陈旧。刷新物化视图可能很麻烦(取决于底层查询)。而查询视图总是为我们提供最多 up-to-date 数据视图。

以下仅供参考,既不完整也不明确

何时使用视图

  • 当我们想要使查询可重用、可共享和可控制时
  • 当我们想要一个简单的界面而不是内部的复杂性时
  • 当我们想要对我们的数据实施访问限制时

何时使用物化视图

  • 当我们想要运行针对大量数据的标准汇总(通常是聚合)查询时
  • 当我们需要来自另一个数据库的数据但我们不能保证其可用性时
  • 当基础数据量足够大且性能要求足够严格以致物化数据具有成本效益时的视图用例

您的问题的答案在 the documentation(*) 中。我无意重写那本精美的手册,但我会回答您的问题,因为已经开始我注定要继续。

  1. 物化视图是来自一个或多个 table 的数据副本,可能在其他模式甚至其他数据库中。
  2. 正如我所说,复制数据会带来开销。存储 space 和处理陈旧数据是最大的成本。
  3. 视图只是一个查询,实际上没有什么可索引的。
  4. select * from user_extents where segment_name = 'name of mview'
  5. 提交时刷新不是免费的。执行会消耗系统资源(通过源 table 进行的交易将花费更长的时间)。另外很多物化视图只能支持完全按需刷新

(*) 这是 Oracle 的文档,因为这是您的配置文件所建议的内容,但其他 RDBMS 平台也有类似的文档。