【问题标题】:Materialized View Refresh On Commit提交时物化视图刷新
【发布时间】:2011-07-09 03:10:06
【问题描述】:

假设我有一个表TABLE 有两列COL_1COL_2

我有一个物化视图,它只是读取TABLE.COL_1,并设置为:REFRESH FAST ON COMMIT

如果我更新TABLE.COL_2,物化视图会刷新吗?

【问题讨论】:

    标签: sql oracle materialized-views


    【解决方案1】:

    是的,更新 COL_2 似乎也会刷新视图。

    更新 COL_2 比在没有实例化视图的类似表上进行可比更新使用更多资源。而更新 COL_2 将更新物化视图的行时间戳(ORA_ROWSCN)。

    -------
    --Compare the amount of work done to update.
    --The difference isn't huge, but is significant and consistent.
    -------
    
    --Create table and materialized view
    create table table1 (col_1 number primary key, col_2 number);
    create materialized view log on table1;
    create materialized view table1_mv refresh fast on commit
      as select col_1 from table1;
    insert into table1 values(1, 1);
    commit;
    
    --Create a regular table for comparison
    create table table2 (col_1 number primary key, col_2 number);
    insert into table2 values(1, 1);
    commit;
    
    --Parse the queries so traces won't count that work.
    update table1 set col_1 = 2;
    update table1 set col_2 = 2;
    update table2 set col_1 = 2;
    update table2 set col_2 = 2;
    rollback;
    
    set autotrace on
    alter system flush buffer_cache;
    update table1 set col_1 = 2;
    --         11  db block gets
    --          8  consistent gets
    --         13  physical reads
    
    rollback;
    alter system flush buffer_cache;
    update table1 set col_2 = 2;
    --          6  db block gets
    --          8  consistent gets
    --         12  physical reads
    
    rollback;
    alter system flush buffer_cache;    
    update table2 set col_1 = 2;
    --          7  db block gets
    --          7  consistent gets
    --          9  physical reads
    
    rollback;
    alter system flush buffer_cache;
    update table2 set col_2 = 2;
    --          3  db block gets
    --          7  consistent gets
    --          8  physical reads
    
    set autotrace off
    
    
    -------
    --Compare ORA_ROWSCN.
    --The times are different, implying the materialized view was modified.
    -------
    
    --(You may need to run these steps slowly to reproduce.  ORA_ROWSCN is
    --not perfect, sometimes you'll see the same timestamp.)
    select scn_to_timestamp(ora_rowscn) from table1_mv;
        --3/5/2011 12:25:25.000000000 AM
    update table1 set col_1 = 3;
    commit;
    select scn_to_timestamp(ora_rowscn) from table1_mv;
        --3/5/2011 12:25:37.000000000 AM
    update table1 set col_2 = 3;
    commit;
    select scn_to_timestamp(ora_rowscn) from table1_mv;
        --3/5/2011 12:25:46.000000000 AM
    

    【讨论】:

    • 谢谢,内容很全面。
    • 我的猜测是物化视图日志决定了这一点。因此,如果您仅在 col1 上创建物化视图日志,我认为更新 col2 将不再有效,对吗?
    猜你喜欢
    • 2013-12-04
    • 2013-12-04
    • 1970-01-01
    • 2012-02-16
    • 2010-09-27
    • 1970-01-01
    • 2020-01-31
    • 2021-10-14
    • 2014-07-11
    相关资源
    最近更新 更多