基于视图的物化视图快速刷新工作是基于表吗?

时间:2015-07-07 06:47:11

标签: oracle materialized-views

我正在审核我的团队的数据库设置,特别是关注物化视图。在大多数情况下,我们目前正在进行“完全”刷新,我想继续快速刷新。

在某些情况下,这很简单 - MV直接基于源数据库上的表,我可以在表上启用MVIEW LOGS并重新创建MV。

但是在很多情况下,MV都基于其他MV和Views等的组合,在我到达源数据库的表之前,它们已经深入了几个层次。

在这些情况下,如果我追踪最终的源表,是否允许MVIEW LOGS允许顶级MV和任何中间MV,使用快速刷新?

2 个答案:

答案 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;

原则上,您确实可以根据视图快速刷新实体化视图。

有些注意事项:

  • 快速刷新的物化视图有一些限制。例如。您无法使用ROWNUMSYSDATEHAVING。有关详细信息,请参阅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版本。