Oracle中的视图和物化视图有什么区别?
当前回答
视图使用查询从底层表中提取数据。
物化视图是磁盘上的一个表,其中包含查询的结果集。
物化视图主要用于在不可行或不希望使用应用索引的标准视图时提高应用程序性能。物化视图可以通过触发器或使用on COMMIT REFRESH选项定期更新。这确实需要一些额外的权限,但并不复杂。ON COMMIT REFRESH至少从Oracle 10开始就存在了。
其他回答
再加上迈克·麦卡利斯特相当彻底的回答……
物化视图只能设置为在编译器认为视图查询简单时,通过数据库检测更改来自动刷新。如果它被认为太复杂,它将无法设置本质上是内部触发器来跟踪源表中的更改,从而仅更新mview表中已更改的行。
在创建物化视图时,您会发现Oracle将mview和表都创建为同名的表,这可能会让人感到困惑。
的观点
它们在查询视图时计算视图定义下面的表中的数据。它是表的逻辑视图,没有数据存储在其他任何地方。
视图的优点是它总是将最新的数据返回给您。视图的缺点是它的性能取决于视图所基于的选择语句有多好。如果视图使用的select语句连接许多表,或者使用基于非索引列的连接,则视图的性能可能很差。
物化视图
它们类似于常规视图,因为它们是数据的逻辑视图(基于选择语句),但是,底层查询结果集已保存到表中。这样做的好处是,当您查询物化视图时,您是在查询一个表,这个表也可能被索引。
In addition, because all the joins have been resolved at materialized view refresh time, you pay the price of the join once (or as often as you refresh your materialized view), rather than each time you select from the materialized view. In addition, with query rewrite enabled, Oracle can optimize a query that selects from the source of your materialized view in such a way that it instead reads from your materialized view. In situations where you create materialized views as forms of aggregate tables, or as copies of frequently executed queries, this can greatly speed up the response time of your end user application. The downside though is that the data you get back from the materialized view is only as up to date as the last time the materialized view has been refreshed.
可以将物化视图设置为手动刷新、按照设置的时间表刷新,或者基于数据库检测底层表中的数据更改。物化视图可以通过将它们与物化视图日志结合起来进行增量更新,物化视图日志充当底层表上的变更数据捕获源。
物化视图最常用于数据仓库/商业智能应用程序中,在这些应用程序中,查询具有数百万行的大型事实表将导致查询响应时间延长,从而导致应用程序不可用。
物化视图还有助于保证时刻的一致性,类似于快照隔离。
物化视图是由选择查询驱动的数据的逻辑视图,但查询的结果将存储在表或磁盘中,查询的定义也将存储在数据库中。
实体化视图的性能比普通视图好,因为实体化视图的数据将存储在表中,表可以被索引,因此连接更快,连接是在实体化视图刷新时完成的,因此不需要每次都像视图那样触发连接语句。
其他不同之处在于,在视图中,我们总是获得最新数据,但在物化视图中,我们需要刷新视图以获得最新数据。 在物化视图的情况下,我们需要一个额外的触发器或一些自动方法,以便我们可以保持MV刷新,这对于数据库中的视图是不需要的。
视图:视图只是一个命名查询。它不存储任何东西。当视图上有查询时,它将运行对视图定义的查询。实际数据来自表格。
物化视图:物理存储数据并定期更新。在查询MV时,给出MV的数据。
物化视图—磁盘上的一个表,其中包含查询的结果集
非物化视图——从底层表中提取数据的查询
推荐文章
- 是否有一种方法以编程方式滚动滚动视图到特定的编辑文本?
- LEFT OUTER JOIN如何返回比左表中存在的记录更多的记录?
- 如何用SQL语句计算百分比
- Postgres唯一约束与索引
- SQL Server动态PIVOT查询?
- MySQL对重复键更新在一个查询中插入多行
- 向现有表添加主键
- 使用电子邮件地址为主键?
- MySQL:如何复制行,但改变几个字段?
- 不能删除或更新父行:外键约束失败
- MongoDB在v4之前不兼容ACID意味着什么?
- SQL WHERE ID IN (id1, id2,…idn)
- 最常见的SQL反模式是什么?
- 如何在PostgreSQL中查看视图的CREATE VIEW代码?
- 错误:没有唯一的约束匹配给定的键引用表"bar"