有一个表,我希望只在其中某个标志字段改变的时候才刷新mv,只要这个标志字段不变,其他字段无论如何变化,这个mv都不需要刷新,mv log也不要生成记录。
不知道filter column是不是为了实现这个而设计的,没找到多少相关资料。
举个例子,
表test:
create table TEST
(
  VAL1 NUMBER(4),
  ID   NUMBER(3) not null,
  VAL2 NUMBER(3)
)
mv log:
create materialized view log on test;
mv:
create materialized view MV$TEST
refresh fast on demand
as
select id,val1,val2 from test;
执行
  insert into test(id,val1,val2) 
  values(myseq.nextval,dbms_random.value(1,100),dbms_random.value(1,500));
  commit;
这时mv log生成记录。
执行
  update test set val1=dbms_random.value(1,100)
  where id=24;
  commit;
这时mv log也要能生成记录。
执行
  update test set val2=dbms_random.value(1,100)
  where id=24;
  commit;
这时希望mv log不要生成记录。

解决方案 »

  1.   

    你要是根据字段来更新materialized view相应的表  
    你可以尝试用trigger来另外更新
      

  2.   


    不太想用trigger,因为将来分析表和业务表可能要分到两个库中。
    没看明白oracle的那个官方文档,不知道
    CREATE MATERIALIZED VIEW LOG ON table WITH column是不是为这个而设计的?
      

  3.   

    可以的,我听我公司已经离职的DBA说过,可以通过字段刷新物化视图,但是具体怎么弄,他没有说!
      

  4.   

    filter column不是为这个目的设计的,这个可以明确。建物化视图的 select语句中,存在子查询,而这个子查查询中如果某个字段不在primary key中,那这个字段就是filter column,这个字段是为了日志的记录而存在的,是为了能明确区分一条记录的变动情况。