Oracle 当基于视图和基于表时,物化视图快速刷新是否有效?

Oracle 当基于视图和基于表时,物化视图快速刷新是否有效?,oracle,materialized-views,Oracle,Materialized Views,我正在检查我的团队的数据库设置,特别是具体化视图。在大多数情况下,我们目前正在进行“完整”刷新,我想转而进行快速刷新 在某些情况下,这是直截了当的-MV直接基于源数据库上的表,我可以在表上启用MVView日志并重新创建MV 但在许多情况下,MVs是基于其他MVs和视图等的组合,在我访问源数据库上的表之前,这些MVs可以深入到几个层次 在这些情况下,如果我跟踪最终源表,在它们上启用MVIEW日志是否允许顶部MV和任何中间MV使用快速刷新?包含基于UNION ALL视图的物化视图快速刷新示例: 因此

我正在检查我的团队的数据库设置,特别是具体化视图。在大多数情况下,我们目前正在进行“完整”刷新,我想转而进行快速刷新

在某些情况下,这是直截了当的-MV直接基于源数据库上的表,我可以在表上启用MVView日志并重新创建MV

但在许多情况下,MVs是基于其他MVs和视图等的组合,在我访问源数据库上的表之前,这些MVs可以深入到几个层次

在这些情况下,如果我跟踪最终源表,在它们上启用MVIEW日志是否允许顶部MV和任何中间MV使用快速刷新?

包含基于UNION ALL视图的物化视图快速刷新示例:

因此,原则上,您确实可以基于视图快速刷新物化视图

需要注意的一些事项:

对于快速刷新的物化视图,有几个限制。例如,您不能使用ROWNUM、SYSDATE或HAVING。有关详细信息,请参阅 与直觉相反,快速刷新并不总是比完全刷新快。这取决于自上次刷新以来更改的数据量;依我看,Oracle应该使用术语“增量刷新” 包含基于UNION ALL视图快速刷新物化视图的示例:

因此,原则上,您确实可以基于视图快速刷新物化视图

需要注意的一些事项:

对于快速刷新的物化视图,有几个限制。例如,您不能使用ROWNUM、SYSDATE或HAVING。有关详细信息,请参阅 与直觉相反,快速刷新并不总是比完全刷新快。这取决于自上次刷新以来更改的数据量;依我看,Oracle应该使用术语“增量刷新”
Oracle为此提供了一个过程:

您可以使用此过程检查物化视图是否能够快速刷新,它还会告诉您为什么不能

对我来说,快速刷新最奇怪的限制是:当您连接多个表时,必须使用旧的Oracle连接语法,ANSI连接语法不起作用。一段时间前,一家公司在Oracle支持部门为这个问题创建了一个案例,但是Oracle的回答是:这不是一个bug,只是缺少文档而已


我不知道它是否仍然适用于Oracle 12c版本。

Oracle为此提供了一个过程:

您可以使用此过程检查物化视图是否能够快速刷新,它还会告诉您为什么不能

对我来说,快速刷新最奇怪的限制是:当您连接多个表时,必须使用旧的Oracle连接语法,ANSI连接语法不起作用。一段时间前,一家公司在Oracle支持部门为这个问题创建了一个案例,但是Oracle的回答是:这不是一个bug,只是缺少文档而已

我不知道它是否仍然适用于Oracle 12c版本

CREATE VIEW view_with_unionall AS
(SELECT c.rowid crid, c.cust_id, 2 umarker
 FROM customers c WHERE c.cust_last_name = 'Smith'
 UNION ALL
 SELECT c.rowid crid, c.cust_id, 3 umarker
 FROM customers c WHERE c.cust_last_name = 'Jones');

CREATE MATERIALIZED VIEW unionall_inside_view_mv
REFRESH FAST ON DEMAND AS
SELECT * FROM view_with_unionall;