2012-11-28 66 views
4

我想在预建表上使用物化视图在迁移前保持表同步。数据不断变化,因此需要跟踪导出开始和导入完成之间的变化。毫无疑问,桌子很大,所以完全刷新太慢了。创建新的物化视图没有清除物化视图日志

步骤ID等来执行:

  1. 新的数据库创建表。
  2. 在旧的数据库表上创建mv日志。
  3. 从旧数据库导入数据到新数据库。
  4. 在prebuild表上的新数据库上创建物化视图,并在创建mv日志时继续刷新它。

问题是创建物化视图的时刻清除了旧表上的mv日志。

Old DB: create table kvrtest(id number,cat number);

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. 

新DB: 创建表kvrtest(身份证号码,猫号);

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 [email protected]; 

此时MV日志清除

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

有什么建议?

回答

4

当您使用REFRESH标记创建新的MATERIALIZED VIEW日志表正在清除,因为我们的视图实际上是在创建之后。

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

如果不想清除日志表的使用从不刷新,然后更改为REFRESH ON DEMAND是这样的:

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION 
USING INDEX 
NEVER REFRESH 
AS 
select * from [email protected]; 

让我们来看看我们的日志表

select * from MLOG$_KVRTEST; 

我们有两排,很好!然后

ALTER MATERIALIZED VIEW kvrtest 
    REFRESH ON DEMAND; 

然后刷新后查看日志表会再次清除。

+0

太棒了!完美的答案。我只需要做一次强制刷新,快速无法工作。 'dbms_snapshot.refresh(list =>'kvrtest',method =>'?',parallelism => 2);' – kon5ad