使用“不存在”的Oracle物化视图

时间:2013-06-18 17:18:22

标签: oracle materialized-views

我知道Oracle物化视图无法使用“not exists”子句快速刷新。 有工作吗?我尝试使用左外连接和(+),但这两个选项似乎也没有用。任何帮助表示赞赏

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); 

3 个答案:

答案 0 :(得分: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  

答案 1 :(得分:2)

在oracle 11下执行查询,我遇到以下错误:

NOT EXISTS

使用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; 

LEFT JOIN

使用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); 

NOT IN

急救信息非常明确:

  

ORA-12015:无法从a创建快速刷新物化视图   复杂查询原因:既不是ROWID也不是主键约束   支持复杂的查询。操作:重新发出命令   REFRESH FORCE或REFRESH COMPLETE选项或创建一个简单的   物化观点。

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

答案 2 :(得分:2)

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

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

反连接通常非常有效。你不只是错过了索引吗?