gpt4 book ai didi

oracle - 创建新的物化 View 而不清除物化 View 日志

转载 作者:行者123 更新时间:2023-12-03 01:36:57 25 4
gpt4 key购买 nike

我想在预构建表上使用物化 View ,以在迁移之前保持表同步。数据不断变化,因此需要跟踪导出开始和导入完成之间的变化。不用说,该表很大,因此完全刷新太慢。

想要执行的步骤:

  1. 在新数据库上创建表。
  2. 在旧数据库表上创建 mv 日志。
  3. 将数据从旧数据库导入到新数据库。
  4. 在预构建表上的新数据库上创建物化 View ,并从创建 mv 日志时不断刷新它。

问题在于,物化 View 创建后,旧表上的 mv 日志就被清除了。

旧数据库: 创建表kvrtest(id号,猫号);

alter table kvrtest add ( constraint pkkvrtest primary key (id) using index);

insert into kvrtest (id, cat) values (1, 1);
commit;

CREATE MATERIALIZED VIEW LOG ON kvrtest WITH PRIMARY KEY;

insert into kvrtest (id, cat) values (2, 1);
insert into kvrtest (id, cat) values (3, 2);
commit;

select * from MLOG$_KVRTEST; --Yields 2, these should be caught by a fast refresh.

新数据库: 创建表kvrtest(id号,猫号);

alter table kvrtest add ( constraint pkkvrtest primary key (id) using index);

insert into kvrtest (id, cat) values (1, 1); --Simulate import.

commit;

CREATE MATERIALIZED VIEW kvrtest
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
REFRESH FORCE ON DEMAND
AS
select * from kvrtest@oldDb;

此时mv日志被清除

select * from MLOG$_KVRTEST; --Yields 0, a fast refresh from here does not catch these records.

有什么建议吗?

最佳答案

当您使用 REFRESH 标签创建新的 MATERIALIZED VIEW 时,日志表会被清除,因为我们的 View 实际上是在创建之后的。

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
REFRESH FORCE ON DEMAND
AS

如果不想清除日志表,请使用 NEVER REFRESH,然后更改为 REFRESH ON DEMAND,如下所示:

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
NEVER REFRESH
AS
select * from kvrtest@oldDb;

让我们看看我们的日志表

select * from MLOG$_KVRTEST;

我们有两行,很好!然后

ALTER MATERIALIZED VIEW kvrtest 
REFRESH ON DEMAND;

刷新 View 日志表后将再次清除。

关于oracle - 创建新的物化 View 而不清除物化 View 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com