マテリアライズドビュー検証 まて マテ マテビュー その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!? 恵比寿にて