我正在审核我的团队的数据库设置,特别是关注物化视图。在大多数情况下,我们目前正在进行“完全”刷新,我想继续快速刷新。
在某些情况下,这很简单 - MV直接基于源数据库上的表,我可以在表上启用MVIEW LOGS并重新创建MV。
但是在很多情况下,MV都基于其他MV和Views等的组合,在我到达源数据库的表之前,它们已经深入了几个层次。
在这些情况下,如果我追踪最终的源表,是否允许MVIEW LOGS允许顶级MV和任何中间MV,使用快速刷新?
答案 0 :(得分:3)
Oracle documentation包含基于FAST REFRESH
视图的UNION ALL
实体化视图的示例:
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;
原则上,您确实可以根据视图快速刷新实体化视图。
有些注意事项:
ROWNUM
,SYSDATE
或HAVING
。有关详细信息,请参阅docs FAST REFRESH
并不总是比COMPLETE REFRESH
快。这取决于自上次刷新以来已更改的数据量;恕我直言,甲骨文应该使用术语INCREMENTAL REFRESH
代替答案 1 :(得分:0)
Oracle为此提供了一个过程:DBMS_MVIEW.EXPLAIN_MVIEW
您可以使用此程序检查您的物化视图是否能够FAST REFRESH
,它还会告诉您原因不适用的原因。
对我来说,FAST REFRESH
最奇怪的限制是:当您连接多个表时,必须使用(旧)Oracle Join语法,ANSI连接语法不起作用。前段时间,Oracle在这个问题上创建了一个案例,但Oracle的答案是:"这不是一个错误,只是缺少文档。"(!)
我不知道它是否仍然适用于Oracle 12c版本。