我知道 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);
我知道 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);
启用快速刷新很棘手,有许多奇怪的限制和无用的错误消息。在这种情况下,您需要创建一个物化视图日志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
在 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 和主键约束。行动:重新发出命令与刷新力或刷新完成选项或创建一个简单的物化视图。
这个问题似乎是不可能的。您必须更改视图类型。
我想不出一个完整的解决方法。如果由于某种原因不存在导致的反连接效率低下,那么您可以基于优化创建一个快速刷新 MV:
select my_id, count(*)
from tab
group by my_id
不过,反连接通常非常有效。您不只是缺少索引吗?