【问题标题】:Can Materialized View fast refresh work when based on views are based on tables?当基于视图基于表时,物化视图快速刷新可以工作吗?
【发布时间】:2015-07-07 17:43:03
【问题描述】:

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

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

但在许多情况下,MV 是基于其他 MV 和视图等的组合,在我到达源数据库上的表之前,它们会深入几个层次。

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

【问题讨论】:

    标签: oracle materialized-views


    【解决方案1】:

    Oracle documentation 包含基于UNION ALL 视图的物化视图的FAST REFRESH 示例:

    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 快。这取决于自上次刷新以来更改的数据量;恕我直言,Oracle 应该改用 INCREMENTAL REFRESH 这个词

    【讨论】:

      【解决方案2】:

      Oracle 为此提供了一个过程:DBMS_MVIEW.EXPLAIN_MVIEW

      您可以使用此程序检查您的物化视图是否支持FAST REFRESH,它还会告诉您不支持的原因。

      对我来说FAST REFRESH 最奇怪的限制是:当您连接多个表时,您必须使用(旧的)Oracle Join 语法,ANSI join 语法不起作用。前段时间,一个在 Oracle 支持部门为这个问题创建了一个案例,但是 Oracle 的回答是:“这不是错误,它只是缺少文档。”(!)

      不知道是否还适用于Oracle 12c版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        • 2021-01-09
        • 2011-10-20
        • 2018-08-23
        • 2013-12-04
        • 2021-05-04
        • 2015-06-13
        相关资源
        最近更新 更多