web-dev-qa-db-ja.com

複数のテーブルのコミット時にマテリアライズドビューをすばやく更新

コミット時に高速更新されるマテリアライズドビューでは、次のクエリがあります

select pp.ROWID AS PP_ROWID,aup.rowid AS AUP_ROWID,
       pp.hierarchicode,pp.id, aup.userid
       from app_useracess aup, core_organization pp;

app_useracessがマテリアライズビューを変更すると、高速な方法でデータが変更されますが、core_organizationでコミットが発生すると、マテリアライズビューは更新されません。残念ながら、次のステートメントで更新しても、

DBMS_SNAPSHOT.REFRESH( 'CORE_POWER_AUTHORIZE_ALLOW','F'); 

更新されません。secoundパラメータとしてCを使用して完全に更新すると、データの変化を感知します。高速な方法でマテリアライズドビューを更新し、core_organizationテーブルのコミット時に更新できますか?

更新:MV DDLは:

create materialized view CORE_POWER_AUTHORIZE_ALLOW
refresh fast on commit
as
select pp.ROWID AS PP_ROWID,aup.rowid AS AUP_ROWID,P.ROWID AS P_ROWID ,
pp.hierarchicode,pp.id, aup.userid,p.id as pID
  from core_power p ,app_userspower aup, core_power pp
 where p.id = aup.powerid
 and pp.hierarchicode like p.hierarchicode || '%';

私はdbms_mview.explain_mviewも使用しており、結果は次のとおりです。

REFRESH_FAST_AFTER_INSERT       Y                   REFRESH_FAST_AFTER_ONETAB_DML   Y                   REFRESH_FAST_AFTER_ANY_DML      Y                   
REFRESH_FAST_PCT                N           PCT is not possible on any of the detail tables in the materialized view    

そしてとても面白いので、このクエリに基づいてマテリアライズされたリフレッシュされたベース:

select e.LAST_REFRESH_TYPE,e.LAST_REFRESH_DATE from dba_mviews e where e.mview_name = 'MV_NAME';

しかし、私のMVのcount(*)は変更されません。

1

DBMS_MVIEW.EXPLAIN_MVIEW + MV_CAPABILITIES_TABLEを使用すると、mviewで高速更新ができない理由を確認できます。

結合条件なしで高速リフレッシュが可能です。

Explain結果を格納するためのテーブルを作成します。

SQL> @?/rdbms/admin/utlxmv

Table created.

テーブル+ mviewを作成します。

create table t1 (c1 number primary key, c2 varchar2(20 char));
create table t2 (c3 number primary key, c4 varchar2(20 char));
create materialized view log on t1 with rowid;
create materialized view log on t2 with rowid;

create materialized view mv1
refresh fast on commit
as select t1.c1, t1.c2, t2.c3, t2.c4,
t1.rowid as rt1, t2.rowid as rt2 from t1, t2;

Mviewについて説明し、高速リフレッシュ機能を確認します。

SQL> exec dbms_mview.explain_mview('MV1');

PL/SQL procedure successfully completed.

SQL> select capability_name, possible, msgtxt from mv_capabilities_table 
     where capability_name like 'REFRESH_FAST%'

CAPABILITY_NAME                          P MSGTXT
---------------------------------------- - ----------------------------------------
REFRESH_FAST                             Y
REFRESH_FAST_AFTER_INSERT                Y
REFRESH_FAST_AFTER_ONETAB_DML            Y
REFRESH_FAST_AFTER_ANY_DML               Y
REFRESH_FAST_PCT                         N PCT is not possible on any of the detail
                                            tables in the materialized view

この例にはパーティションがないため、PCT高速リフレッシュは不可能です。

高速更新を確認します。

SQL> select * from mv1;

no rows selected

SQL> insert into t1 select rownum, 'A' from dual connect by level <= 2;

2 rows created.

SQL> insert into t2 select rownum, 'A' from dual connect by level <= 2;

2 rows created.

SQL> commit;

Commit complete.

SQL> select * from mv1;

        C1 C2                           C3 C4                   RT1                RT2
---------- -------------------- ---------- -------------------- ------------------ ------------------
         1 A                             1 A                    AAAOOLAAEAAAACPAAA AAAOONAAEAAAACvAAA
         1 A                             2 A                    AAAOOLAAEAAAACPAAA AAAOONAAEAAAACvAAB
         2 A                             1 A                    AAAOOLAAEAAAACPAAB AAAOONAAEAAAACvAAA
         2 A                             2 A                    AAAOOLAAEAAAACPAAB AAAOONAAEAAAACvAAB

SQL> select last_refresh_type from dba_mviews where mview_name = 'MV1';

LAST_REF
--------
FAST
1
Balazs Papp