マテリアライズドビュー検証 まて マテ マテビュー その11

<マテリアライズドビュー検証 まて マテ マテビュー その11>
ペンネーム:クリープ

今回も前回に引き続きマテビューに関する読者の質問についてお応えしたいと
思います。
折角なので、新たな題名を。。。

題して!
まだ マダ マテビュー!

今回はマテビューのNEVER句に関する質問にお応え致します。。。

■■■■■今回のあらすじ■■■■■
1)マテビューでNEVER句にした時、クエリーリライトされるのか?

■環境
Microsoft Windows XP Pro
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Production

1)マテビューでNEVER句にした時、クエリーリライトされるのか?

まずは、NEVER句について説明します。
NEVER句をマテビュー作成時に指定することで、dbms_mview.refreshを実行し
てもリフレッシュされなくなります。
実際に確認してみましょう。

SQL> create materialized view mv_emp never refresh as
     select job, sum(sal) sum_sal from emp group by job;

SQL> exec dbms_mview.refresh( 'mv_emp' );
BEGIN dbms_mview.refresh( 'mv_emp' ); END;

*
行1でエラーが発生しました。:
ORA-23538: NEVER
REFRESHマテリアライズド・ビュー("MV_EMP")は明示的にリフレッシュできません
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2255
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2461
ORA-06512: "SYS.DBMS_SNAPSHOT", 行2430
ORA-06512: 行1

このように、マテビュー作成時にNEVER句を指定することで、作成されたマテ
ビューをリフレッシュしようとしてもリフレッシュされずにエラーになります。
ちなみにこのNEVER句、その他のリフレッシュ句とは異なり(refresh fast
refresh forceなど)、never refreshと構文が逆になっています。設定時には
気をつけましょう。

では、NEVER句を指定したいわば化石と化してしまったマテビューに対して
リライトされるのでしょうか?
マテビューを再作成して確認してみましょう。

SQL> drop materialized view mv_emp;

SQL> create materialized view mv_emp never refresh enable query rewrite
     as select job, sum(sal) sum_sal from emp group by job;

SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('select job, sum(sal) sum_sal
     from emp group by job', statement_id => 'test1' );

SQL> select message, rewritten_txt from rewrite_table
     where statement_id = 'test1';

MESSAGE
---------------------------------------------------------------------
QSM-01151: 問合せはリライトされました
QSM-01209: テキスト一致アルゴリズムを使用して、マテリアライズド・ビュー
MV_EMPで問合せがリライトされました

REWRITTEN_TXT
---------------------------------------------------------------------
SELECT MV_EMP.JOB JOB,MV_EMP.SUM_SAL SUM_SAL FROM SCOTT.MV_EMP MV_EMP
SELECT MV_EMP.JOB JOB,MV_EMP.SUM_SAL SUM_SAL FROM SCOTT.MV_EMP MV_EMP

化石化しているマテビューに対してもちゃんとリライトしてくれました。
クエリーリライトはリライト可能な場合、マテビューの形態に関係なくリライ
トしてくれる、ということになります。

これはつまり、元表との整合性が取れない場合は、通常のマテビューと同じよ
うにリライトされない、ということになります。

SQL> insert into emp values
    (9999, 'TOM', 'PART-TIME', null, sysdate, 300, null, 10 );

SQL> commit;

SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('select job, sum(sal) sum_sal
     from emp group by job', statement_id => 'test2' );

SQL> select message, rewritten_txt from rewrite_table
     where statement_id = 'test2';

MESSAGE
---------------------------------------------------------------------
QSM-01150: 問合せをリライトしませんでした
QSM-01029: マテリアライズド・ビューMV_EMPはENFORCED整合性モードで失効
しています。

REWRITTEN_TXT
---------------------------------------------------------------------
select job, sum(sal) sum_sal from emp group by job
select job, sum(sal) sum_sal from emp group by job

今後、このマテビューにリライトされることはないでしょう。。。

ちなみに。
このように元表とマテビューの整合性が取れない場合でも初期化パラメータの
query_rewrite_integrityをstale_toleratedに変更すればクエリーリライトさ
れます。
(まて マテ マテビュー総集編参照)
追加で確認しておきましょう!

SQL> alter system set query_rewrite_integrity = 'stale_tolerated' scope =
     memory;

SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('select job, sum(sal) sum_sal
     from emp group by job', statement_id => 'test3' );

SQL> select message, rewritten_txt from rewrite_table
     where statement_id = 'test3';

MESSAGE
---------------------------------------------------------------------
QSM-01151: 問合せはリライトされました
QSM-01209: テキスト一致アルゴリズムを使用して、マテリアライズド・ビュ
ーMV_EMPで問合せがリライトされました

REWRITTEN_TXT
---------------------------------------------------------------------
SELECT MV_EMP.JOB JOB,MV_EMP.SUM_SAL SUM_SAL FROM SCOTT.MV_EMP MV_EMP
SELECT MV_EMP.JOB JOB,MV_EMP.SUM_SAL SUM_SAL FROM SCOTT.MV_EMP MV_EMP

実際の運用ではあまり使われないと思われますが、このようなパラメータがあ
ることは認識しておきましょう。

以上、まだマダマテビューをお送りしました。

2回にわたり外伝のような形でON COMMIT句とNEVER句についての検証を行いま
した。
今週でまてまてマテビューは(本当に)最後になります。

またいつか、マテビューワールドでお会いしましょう!

以上。

GWの旅行をgoogle earthで検討中!これってWEB2.0!? 恵比寿にて