在oracle中增量刷新物化视图

3qpi33ja  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(282)

有一个脚本,它基本上是删除前一天创建的物化视图,然后重新创建物化视图。物化视图是通过将某些事实与维连接起来创建的。
我在想,与删除物化视图不同,我们可以增量刷新此视图。
要手动刷新此视图,我们可以使用

DBMS_MVIEW.Refresh('TEST_MV');

如何以增量方式刷新实体化视图?

daolsyd0

daolsyd01#

必须在定义视图时将视图定义为快速刷新视图。对于具有联接的视图,每个表的ROWID必须位于视图中。此外,必须使用with rowid创建实体化视图日志。
参见:https://docs.oracle.com/cd/B19306_01/server.102/b14223/basicmv.htm#sthref537

xhv8bpkk

xhv8bpkk2#

快速刷新当然是最有效的选项,但由于限制,并不总是可行的,而且源表的所有者通常不希望在其表上有触发器(这可能会导致表的维护方式受到限制)。它还有一个缺点,即只会增加更多的复杂性(触发器、日志表等)。
我发现在大多数情况下,MERGE语句工作得最好,因为它可以像外科手术一样只添加和/或修改需要更改的行。

-- new and modified rows:

MERGE INTO target tgt
USING (SELECT n.*,
              o.rowid row_id
         FROM (SELECT [mv SQL]) n,
              target o
        WHERE n.pkcol = o.pkcol(+)
          AND (o.pkcol IS NULL OR -- new rows
               n.attr1 != o.attr1 OR  -- changed rows
               n.attr2 != o.attr2)) src
ON (src.rowid = tgt.ROWID)
WHEN MATCHED THEN UPDATE SET tgt.attr1 = src.attr1,
                             tgt.attr2 = src.attr2
WHEN NOT MATCHED THEN INSERT (pkcol,
                              attr1,
                              attr2)
                      VALUES (src.pkcol,
                              src.attr1,
                              src.attr2);

-- deleted rows:

DELETE FROM target 
 WHERE pkcol NOT IN (SELECT pkcol FROM (SELECT [mv SQL]));

这当然可以与PDML并行化。

相关问题