備忘録

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

マテビューの元表に対してのTRUNCATE

結合マテビューの構成表に対してTRUNCATEした後、高速リフレッシュをするとエラーになる。

ORA-32321: "TEST"."MV01"のREFRESH FASTはディテール表のTRUNCATE後はサポートされていません

高速リフレッシュではなく、強制リフレッシュならエラーにならない。
ちなみに「f」だと高速(FAST)、「c」だと完全(Complete)、「?」だと強制(Force)となる。
exec DBMS_MVIEW.REFRESH('MV01', '?');
強制リフレッシュは、高速リフレッシュが出来る場合はは高速、出来ない場合は、完全リフレッシュになる。


SQL> drop table tbl01;

表が削除されました。

SQL> create table tbl01 (
2 n1 number(10)
3 );

表が作成されました。

SQL> ALTER TABLE tbl01 ADD CONSTRAINT PK_TBL01 PRIMARY KEY(n1);

表が変更されました。

SQL>
SQL> drop table tbl02;

表が削除されました。

SQL> create table tbl02 (
2 n1 number(10)
3 ,d1 date
4 );

表が作成されました。

SQL> ALTER TABLE tbl02 ADD CONSTRAINT PK_TBL02 PRIMARY KEY(n1);

表が変更されました。

SQL>
SQL> drop table tbl03;

表が削除されました。

SQL> create table tbl03 (
2 n1 number(10)
3 ,vc varchar2(100)
4 );

表が作成されました。

SQL> ALTER TABLE tbl03 ADD CONSTRAINT PK_TBL03 PRIMARY KEY(n1);

表が変更されました。

SQL>
SQL> CREATE MATERIALIZED VIEW LOG ON TBL01 WITH ROWID,PRIMARY KEY;

マテリアライズド・ビュー・ログが作成されました。

SQL> CREATE MATERIALIZED VIEW LOG ON TBL02 WITH ROWID,PRIMARY KEY;

マテリアライズド・ビュー・ログが作成されました。

SQL> CREATE MATERIALIZED VIEW LOG ON TBL03 WITH ROWID,PRIMARY KEY;

マテリアライズド・ビュー・ログが作成されました。

SQL>
SQL> drop MATERIALIZED VIEW MV01;

マテリアライズド・ビューが削除されました。

SQL> CREATE MATERIALIZED VIEW MV01 REFRESH FAST AS
2 (
3 SELECT
4 t1.ROWID AS T1_ROWID
5 ,t2.ROWID AS T2_ROWID
6 ,CAST(NULL AS ROWID) AS T3_ROWID
7 ,'1' MARKER
8 , t1.n1
9 , t2.D1
10 , NULL AS vc
11 FROM TBL01 t1, TBL02 t2
12 WHERE t1.N1 = t2.N1
13 )
14 UNION ALL
15 (
16 SELECT
17 t1.ROWID AS T1_ROWID
18 ,CAST(NULL AS ROWID) AS T2_ROWID
19 ,t3.ROWID AS T3_ROWID
20 ,'2' MARKER
21 , t1.n1
22 , NULL
23 , t3.VC
24 FROM TBL01 t1, TBL03 t3
25 WHERE t1.N1 = t3.N1
26 )
27 ;

マテリアライズド・ビューが作成されました。

SQL>
SQL> insert into tbl01 values (1);

1行が作成されました。

SQL> insert into tbl02 values (1, sysdate);

1行が作成されました。

SQL> insert into tbl01 values (2);

1行が作成されました。

SQL> insert into tbl03 values (2, 'aaa');

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL>
SQL> exec DBMS_MVIEW.REFRESH( 'MV01', 'f');

PL/SQLプロシージャが正常に完了しました。

SQL> select count(*) from mv01;

COUNT(*)
----------
2

SQL> select UNUSABLE, KNOWN_STALE, INVALID from USER_MVIEW_ANALYSIS WHERE MVIEW_NAME='MV01';

UN KN IN
-- -- --
N N N

SQL>
SQL> truncate table tbl03;

表が切り捨てられました。

SQL>
SQL> select UNUSABLE, KNOWN_STALE, INVALID from USER_MVIEW_ANALYSIS WHERE MVIEW_NAME='MV01';

UN KN IN
-- -- --
N N Y

SQL> select count(*) from mv01;

COUNT(*)
----------
2

SQL> exec DBMS_MVIEW.REFRESH( 'MV01', 'f');
BEGIN DBMS_MVIEW.REFRESH( 'MV01', 'f'); END;

*
行1でエラーが発生しました。:
ORA-32321: "TEST"."MV01"のREFRESH
FASTはディテール表のTRUNCATE後はサポートされていません
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2563
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2776
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2745
ORA-06512: 行1


SQL> select UNUSABLE, KNOWN_STALE, INVALID from USER_MVIEW_ANALYSIS WHERE MVIEW_NAME='MV01';

UN KN IN
-- -- --
N N Y

SQL> select count(*) from mv01;

COUNT(*)
----------
2

SQL>
SQL> exec DBMS_MVIEW.REFRESH( 'MV01', '?');

PL/SQLプロシージャが正常に完了しました。

SQL> select UNUSABLE, KNOWN_STALE, INVALID from USER_MVIEW_ANALYSIS WHERE MVIEW_NAME='MV01';

UN KN IN
-- -- --
N N N

SQL> select count(*) from mv01;

COUNT(*)
----------
1

SQL>


単表マテビューの場合、結合マテビューと違う動きをする。
truncateした後、強制リフレッシュをしてもマテビューにデータが残る。
なぜかと調べると 切捨て後のマテリアライズド・ビュー・ログの保存例 にあるように、TRUNCATE TABLE XXX としただけだと、ログが残るらしい。
TRUNCATE TABLE XXX PURGE MATERIALIZED VIEW LOG としないとだめ。
結合マテビューと同じ動きをしてくれた方がうれしい。
普通、「PURGE MATERIALIZED VIEW LOG」なんてつけない。
こうなってしまうと、強制リフレッシュではダメで、完全リフレッシュするしかなくなる。


SQL> drop table tbl04;

表が削除されました。

SQL> create table tbl04 (
2 n1 number(10)
3 );

表が作成されました。

SQL> ALTER TABLE tbl04 ADD CONSTRAINT PK_TBL04 PRIMARY KEY(n1);

表が変更されました。

SQL> CREATE MATERIALIZED VIEW LOG ON TBL04 WITH ROWID, PRIMARY KEY;

マテリアライズド・ビュー・ログが作成されました。

SQL>
SQL> drop MATERIALIZED VIEW MV04;

マテリアライズド・ビューが削除されました。

SQL> CREATE MATERIALIZED VIEW MV04 REFRESH FAST AS
2 select * from tbl04;

マテリアライズド・ビューが作成されました。

SQL>
SQL> insert into tbl04 values(1);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL>
SQL> exec DBMS_MVIEW.REFRESH('MV04', '?');

PL/SQLプロシージャが正常に完了しました。

SQL>
SQL> select * from mv04;

N1
----------
1

SQL>
SQL> truncate table tbl04;

表が切り捨てられました。

SQL>
SQL> exec DBMS_MVIEW.REFRESH('MV04', '?');

PL/SQLプロシージャが正常に完了しました。

SQL>
SQL> select * from mv04;

N1
----------
1

SQL> exec DBMS_MVIEW.REFRESH('MV04', 'c');

PL/SQLプロシージャが正常に完了しました。

SQL> select * from mv04;

レコードが選択されませんでした。
前のページ 次のページ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。