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

投稿日: 2006年4月05日

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

全8回に渡ってリフレッシュ、クエリーリライトの機能について見てきました。
今回は、今まで検証してきた機能の総まとめをしちゃいます。ここを見れば今
まで行ってきた検証が一目瞭然!という訳ではないですが、検証で利用した機
能を最後におさらいしちゃいましょう。

■■■■■今回のあらすじ■■■■■
1)マテビュー作成時に必要な設定
2)リフレッシュ フラッシュバック!
3)クエリーリライト フラッシュバック!
4)DBMS_ADVISOR.TUNE_MVIEW

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

1)マテビュー作成時に必要な設定
1.grant create any materialized view to ユーザー名;

2)リフレッシュ フラッシュバック!
リフレッシュには完全リフレッシュと高速リフレッシュがある。

□完全リフレッシュ
DELETE文で削除した後に再度データを集計してマテビューにInsert。

1.CREATE MATERIALIZED VIEW文にREFRESH COMPLETE句。
2.DBMS_MVIEW.REFRESH( [マテビュー], ‘c’ );
でリフレッシュを実行。

※DELETE文の削除をTRUNCATE文で削除するようにする方法。
後ろから2つ目の値をFALSEにすることで、マテビューをTRUNCATE文で削除。

DBMS_MVIEW.REFRESH([マテビュー], ‘c’, NULL, TRUE, FALSE, 1, 0, 0,
FALSE, FALSE);

□高速リフレッシュ
元表に変更があった箇所のみをマテビューに反映。(MLOGの作成が必須。)
1.CREATE MATERIALIZED VIEW文にREFRESH FAST句。
2.DBMS_MVIEW.REFRESH( [リフレッシュするマテビュー], ‘f’ );
でリフレッシュを実行。

□FORCEオプション
高速リフレッシュを試みて、できない時に完全リフレッシュが実行される。
1.CREATE MATERIALIZED VIEW文にREFRESH FORCE句。
(FORCEはREFRESH句を指定しない場合のデフォルト)
2.DBMS_MVIEW.REFRESH( [リフレッシュするマテビュー], ‘?’ );
でリフレッシュを実行。

□高速リフレッシュを可能にする時の注意点。
1.MLOGを作成する必要あり。MLOG作成時の注意点。
with rowid句
sequence句(集計を含むマテビューの場合)
including new values句(集計を含むマテビューの場合)
2.マテビュー作成時にselect文に必要な項目を追加。
例)
集計されたマテビューの場合SELECT句にCOUNT(*),COUNT(expr)を指定。
複数のテーブルを結合したマテビューの場合:SELECT句にROWIDを指定。
など。。。

□高速リフレッシュ可能かどうか確認。
1.DBMS_MVIEW.EXPLAIN_MVIEWで確認。
○実行前にテーブル作成(mv_capabilities_tableテーブル)
SQL> @?/rdbms/admin/utlxmv.sql

○実行
SQL> EXEC DBMS_MVIEW.EXPLAIN_MVIEW( マテビュー名 );

○確認
SQL> select capability_name, possible, related_text, msgtxt
from mv_capabilities_table where capability_name Like ‘%REFRESH%’;

2.DBMS_MVIEW.TUNE_MVIEWで確認。(後で説明)

3)クエリーリライト フラッシュバック!
□クエリーリライトに必要な設定。
1.CREATE MATERIALIZED VIEW文にENABLE QUERY REWRITE句を指定。

2.初期化パラメータQUERY_REWRITE_ENABLEDを確認しTRUEに設定。
(FORCEにすると常にリライト)

3.初期化パラメータQUERY_REWRITE_INTEGRITYを確認。
※クエリーリライトされるレベルを設定。
enforced :マテビューと問合せSQL文の整合性が保障
trusted :ディメンションを利用してクエリーリライトする場合
stale_tolerated :整合性がとれてなくてもリライトされる

□クエリーリライトされたかどうか確認。
1.DBMS_MVIEW.EXPLAIN_REWRITEで確認。
○実行前にテーブル作成(rewrite_tableテーブル)
SQL> @?/rdbms/admin/utlxrw.sql

○実行
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE(SQL文、又はマテビュー名);

○確認
SQL> select message, rewritten_txt from rewrite_table order by sequence;

4)DBMS_ADVISOR.TUNE_MVIEW
最後に、DBMS_ADVISOR.TUNE_MVIEWというパッケージを使用してみましょう。
このパッケージを使用することで、高速リフレッシュの制限にひっかかるよう
なマテビューを事前に確認することができます。

例えば、以下のようなSQL文を実行して集計するマテビューを作成する場合、

select job, sum(sal) from emp group by job;

以下を実行することで高速リフレッシュを意識したマテビューの構文を作成し
てくれます。

SQL> CREATE DIRECTORY TUNE_RESULTS AS  'c:';

SQL> GRANT READ, WRITE ON DIRECTORY TUNE_RESULTS TO PUBLIC;

SQL> VARIABLE emp_var VARCHAR2(30);

SQL> EXEC :emp_var := 'emp_mv';

SQL> EXEC DBMS_ADVISOR.TUNE_MVIEW(:emp_var, 'CREATE MATERIALIZED VIEW
     emp_mv AS select job, sum(sal) from emp group by job');
SQL> EXEC DBMS_ADVISOR.CREATE_FILE(DBMS_ADVISOR.GET_TASK_SCRIPT(:emp_var),
     'TUNE_RESULTS', 'mv_create.sql');

ディレクトリを定義上記でc:mv_create.sqlというファイルが作成されます。
作成されたファイルの中身を確認すると。。。

CREATE MATERIALIZED VIEW LOG ON
    "SCOTT"."EMP"
    WITH ROWID, SEQUENCE("JOB","SAL")
    INCLUDING NEW VALUES;

ALTER MATERIALIZED VIEW LOG FORCE ON
    "SCOTT"."EMP"
    ADD ROWID, SEQUENCE("JOB","SAL")
    INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW SCOTT.EMP_MV
    REFRESH FAST WITH ROWID
    DISABLE QUERY REWRITE
    AS SELECT SCOTT.EMP.JOB C1, SUM("SCOTT"."EMP"."SAL") M1,
    COUNT("SCOTT"."EMP"."SAL")
       M2, COUNT(*) M3 FROM SCOTT.EMP GROUP BY SCOTT.EMP.JOB;

というように、MLOGとマテビュー作成のスクリプトが作成されています。
MLOGをみると、with rowid句とsequence句、including new values句が指定さ
れています。またマテビューでは、REFRESH FAST 句とSELECT文にはCOUNT(*),
COUNT(SAL)句が指定されていて、高速リフレッシュで必要な項目が全て網羅さ
れています。

高速リフレッシュを利用する場合、このツールを利用してMLOGとマテビューを
作成した方がよいでしょう。

以上でマテビュー検証は終了です。
パーティションなど検証できなかった項目については、また別の機会に再検証
できればと思います。

以上。

エープリールフールにあまりウソをつきませんでした。 恵比寿にて