コミット時に高速更新されるマテリアライズドビューでは、次のクエリがあります
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(*)は変更されません。
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