Oracle 当基于视图和基于表时,物化视图快速刷新是否有效?
我正在检查我的团队的数据库设置,特别是具体化视图。在大多数情况下,我们目前正在进行“完整”刷新,我想转而进行快速刷新 在某些情况下,这是直截了当的-MV直接基于源数据库上的表,我可以在表上启用MVView日志并重新创建MV 但在许多情况下,MVs是基于其他MVs和视图等的组合,在我访问源数据库上的表之前,这些MVs可以深入到几个层次 在这些情况下,如果我跟踪最终源表,在它们上启用MVIEW日志是否允许顶部MV和任何中间MV使用快速刷新?包含基于UNION ALL视图的物化视图快速刷新示例: 因此,原则上,您确实可以基于视图快速刷新物化视图 需要注意的一些事项: 对于快速刷新的物化视图,有几个限制。例如,您不能使用ROWNUM、SYSDATE或HAVING。有关详细信息,请参阅 与直觉相反,快速刷新并不总是比完全刷新快。这取决于自上次刷新以来更改的数据量;依我看,Oracle应该使用术语“增量刷新” 包含基于UNION ALL视图快速刷新物化视图的示例: 因此,原则上,您确实可以基于视图快速刷新物化视图 需要注意的一些事项: 对于快速刷新的物化视图,有几个限制。例如,您不能使用ROWNUM、SYSDATE或HAVING。有关详细信息,请参阅 与直觉相反,快速刷新并不总是比完全刷新快。这取决于自上次刷新以来更改的数据量;依我看,Oracle应该使用术语“增量刷新”Oracle 当基于视图和基于表时,物化视图快速刷新是否有效?,oracle,materialized-views,Oracle,Materialized Views,我正在检查我的团队的数据库设置,特别是具体化视图。在大多数情况下,我们目前正在进行“完整”刷新,我想转而进行快速刷新 在某些情况下,这是直截了当的-MV直接基于源数据库上的表,我可以在表上启用MVView日志并重新创建MV 但在许多情况下,MVs是基于其他MVs和视图等的组合,在我访问源数据库上的表之前,这些MVs可以深入到几个层次 在这些情况下,如果我跟踪最终源表,在它们上启用MVIEW日志是否允许顶部MV和任何中间MV使用快速刷新?包含基于UNION ALL视图的物化视图快速刷新示例: 因此
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;