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