3

Oracle マテリアライズド ビューは、「存在しない」句で高速リフレッシュできないことを知っています。回避策はありますか。左外部結合と (+) を使用してみましたが、これらの 2 つのオプションも機能していないようです。どんな助けでも大歓迎です

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

完全な回避策は考えられません。存在しないことに起因するアンチジョインが何らかの理由で非効率的である場合は、次の最適化に基づいて高速リフレッシュ MV を作成できます。

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

ただし、通常、アンチジョインは非常に効率的です。インデックスが欠けているだけではありませんか?

于 2013-06-18T21:40:29.583 に答える