3

我知道 Oracle 物化视图不能用“不存在”子句快速刷新。有解决办法吗。我尝试使用左外连接和 (+) 但这两个选项似乎也不起作用。任何帮助表示赞赏

create materialized view mv_myview refresh fast as 
select a.* 
from tableA a 
where 
    not exists (select * from tableB b where a.my_id = b.my_id); 
4

3 回答 3

3

启用快速刷新很棘手,有许多奇怪的限制和无用的错误消息。在这种情况下,您需要创建一个物化视图日志WITH ROWID,使用(+)连接语法,并ROWID为每个表添加一个。

create table tablea(my_id number primary key, a number);
create table tableb(my_id number primary key, b number);

create materialized view log on tablea with rowid;
create materialized view log on tableb with rowid;

create materialized view mv_myview refresh fast on commit as 
select a.my_id, a.a, b.b, a.rowid a_rowid, b.rowid b_rowid
from tableA a, tableB b
where a.my_id = b.my_id(+)
    and b.My_id IS NULL;

insert into tablea values(1, 1);
commit;

select * from mv_myview;

MY_ID  A  B  A_ROWID             B_ROWID
-----  -  -  -------             -------
1      1     AAAUH3AAEAAC+t0AAA  
于 2013-06-19T12:41:37.173 回答
2

在 oracle 11 下执行查询,出现以下错误:

不存在

使用 LEFT JOIN,我遇到了同样的问题:

create materialized view mv_myview refresh fast as 
select a.* 
from tableA a LEFT JOIN tableB b ON a.my_id = b.my_id
where 
    b.id IS NULL; 

左连接

使用 NOT IN 时同样的问题...

create materialized view mv_myview refresh fast as 
select a.* 
from tableA a 
where 
    a.my_id not in (select b.my_id from tableB b); 

不在

急救信息很清楚:

ORA-12015:无法从复杂查询创建快速刷新物化视图原因:复杂查询不支持 ROWID 和主键约束。行动:重新发出命令与刷新力或刷新完成选项或创建一个简单的物化视图。

这个问题似乎是不可能的。您必须更改视图类型。

于 2013-06-18T21:07:35.000 回答
2

我想不出一个完整的解决方法。如果由于某种原因不存在导致的反连接效率低下,那么您可以基于优化创建一个快速刷新 MV:

select my_id, count(*)
from   tab
group by my_id

不过,反连接通常非常有效。您不只是缺少索引吗?

于 2013-06-18T21:40:29.583 回答