web-dev-qa-db-ja.com

マテリアライズドビューのコミット時の高速リフレッシュ

次のようにテーブルDEPTとEMPを作成しました:

create table DEPT
( dept_no number , dept_name varchar(32) , dept_desc varchar(32),
  CONSTRAINT dept_pk Primary Key (dept_no) );

create table EMP
( emp_no number, dept_no number, CONSTRAINT emp_pk Primary Key (emp_no,dept_no));

insert into dept values (10,'it','desc1');
insert into dept values (20,'hr','desc2');

insert into emp values (1,10);
insert into emp values (2,20);

これらのテーブルに、次のようにROWIDビューとマテリアライズドビューを使用してマテリアライズドビューログを作成しました。

create materialized view log on emp with rowid;
create materialized view log on dept with rowid;

create materialized view empdept_mv refresh fast on commit as
select a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no,b.emp_no
from dept a, emp b
where a.dept_no=b.dept_no ;

select * from emp;
    EMP_NO    DEPT_NO
  ---------- ----------
     1         10
     2         20
     3         30

select * from dept;
   DEPT_NO DEPT_NAME                        DEPT_DESC
---------- -------------------------------- --------------------------------
    10 it                               desc1
    20 hr                               desc2
    30 it                               desc3

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2

新しいレコードを挿入してCOMMITを実行しました。 ..それでもマテリアライズドビューを確認すると、新しいレコードがマテリアライズドビューに表示されません。

insert into dept values (30,'it','desc3');
commit;
insert into emp values (3,30);
commit;

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2

ここで、高速および完全更新の手順を per として実行すると、高速更新はMviewを更新しませんが、完全更新は更新します。 (注:ただし、Mviewはまだコミット時に更新されます

execute DBMS_MVIEW.REFRESH('empdept_mv', 'F', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2


execute DBMS_MVIEW.REFRESH('test_mview2', 'C', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2
AAAli5AABAAAPZ6AAC AAAli7AABAAAQs6AAC         30          3

DBMS_MVIEW.EXPLAIN_MVIEWの出力は次のとおりです:(capability_name --Possible-- msgtxt)

  1. PCT --N--
  2. REFRESH_COMPLETE --Y--
  3. REFRESH_FAST --Y--
  4. 書き換え--N--
  5. PCT_TABLE --N-- Oracleエラー:詳細については、RELATED_NUMおよびRELATED_TEXTを参照してください。
  6. REFRESH_FAST_AFTER_INSERT --Y--
  7. REFRESH_FAST_AFTER_ONETAB_DML --Y--
  8. REFRESH_FAST_AFTER_ANY_DML --Y--
  9. REFRESH_FAST_PCT --N-- PCTは、母校のどの詳細テーブルでも使用できません。
  10. REWRITE_FULL_TEXT_MATCH --N-- Oracleエラー:詳細については、RELATED_NUMおよびRELATED_TEXTを参照してください。
  11. REWRITE_FULL_TEXT_MATCH--N--マテリアライズドビューではクエリの書き換えが無効になっています
  12. REWRITE_PARTIAL_TEXT_MATCH--N--マテリアライズドビューはどのタイプのクエリの書き換えもサポートできません
  13. REWRITE_PARTIAL_TEXT_MATCH--N--マテリアライズドビューではクエリの書き換えが無効になっています
  14. REWRITE_GENERAL--N--マテリアライズドビューはどのタイプのクエリリライトもサポートできません
  15. REWRITE_GENERAL--N--マテリアライズドビューではクエリの書き換えが無効になっています
  16. REWRITE_PCT --N--一般的な書き換えができない、またはPCTができない
  17. PCT_TABLE_REWRITE --N-- Oracleエラー:詳細については、RELATED_NUMおよびRELATED_TEXTを参照してください。

コミット時に高速リフレッシュを実現するにはどうすればよいですか?
Oracleバージョンの詳細は次のとおりです。
NLSRTL10.2.0.4.0プロダクション
Oracle Database 10g 10.2.0.4.064ビットプロダクション
PL/SQL10.2.0.4.0本番
Linux用TNS:10.2.0.4.0本番

10
Deepak Venga

問題がまだ続くかどうかはわかりませんが、あなたが提供したアーティスを見てみると、何かに気づきました(これはここでの解決策かもしれません):

コミット時の更新

マテリアライズド・ビューは、ONCOMMITメソッドを使用して自動的にリフレッシュできます。したがって、マテリアライズド・ビューが定義されている表を更新したトランザクションがコミットされるたびに、それらの変更はマテリアライズド・ビューに自動的に反映されます。このアプローチを使用する利点は、マテリアライズドビューを更新することを覚えておく必要がないことです。 唯一の欠点は、余分な処理が含まれるため、コミットの完了に必要な時間がわずかに長くなることです。ただし、データウェアハウスでは、同時プロセスが発生する可能性が低いため、これは問題にはなりません。同じテーブルを更新しようとしています。

  • 太線に注意してください。

次に、次のようになります。

表7-1オンデマンドの更新方法

更新オプションパラメータ説明[〜#〜] complete [〜#〜] C マテリアライズドビューの定義クエリを再計算して更新します

[〜#〜] fast [〜#〜] F マテリアライズドビューに変更を段階的に適用して更新します。ローカルのマテリアライズド・ビューの場合、オプティマイザーによって最も効率的であると推定されるリフレッシュ方法を選択します。考慮される更新方法は、ログベースのFASTおよびFAST_PCTです。

FAST_PCT P詳細テーブルの変更されたパーティションの影響を受けるマテリアライズドビューの行を再計算して更新します。

[〜#〜] force [〜#〜]?高速リフレッシュを試みます。それが不可能な場合は、完全に更新されます。ローカルのマテリアライズド・ビューの場合、オプティマイザーによって最も効率的であると推定されるリフレッシュ方法を選択します。考慮される更新方法は、ログベースのFAST、FAST_PCT、およびCOMPLETEです。

  • 太線に注意してください。
  • 私は個人的にFORCEオプションを好みます。

これがしばらくしてから再び発生するかどうかを教えてください(DBのパラメーターとそれが実行されているマシンによって異なりますので、どれだけヒントを与えることもできません)。

高速更新が可能な場合

すべてのマテリアライズド・ビューが高速リフレッシュ可能であるとは限りません。したがって、パッケージDBMS_MVIEW.EXPLAIN_MVIEWを使用して、使用可能なリフレッシュ方法を判別してください。マテリアライズドビュー。

マテリアライズド・ビューを高速リフレッシュ可能にする方法がわからない場合は、DBMS_ADVISOR.TUNE_MVIEWプロシージャーを使用できます。このプロシージャーは、以下に必要なステートメントを含むスクリプトを提供します。高速で更新可能なマテリアライズドビューを作成します。

乾杯

3
g00dy

ROWIDを使用してマテリアライズド・ビュー・ログを作成したようですが、両方のテーブルに主キーがあるため、ROWIDなしで試すことができるため、実際には必要ありません。

empでマテリアライズドビューログを作成します。部門でマテリアライズドビューログを作成します。

さらに、ROWIDを使用してマテリアライズド・ビュー・ログを作成する場合は、ROWIDを使用してマテリアライズド・ビューを作成する必要があります。

マテリアライズドビューempdept_mvを作成し、コミット時にROWIDを使用して高速に更新します。

これらの変更を試して、マテリアライズドビューがコミット時に高速更新されるかどうかを確認できます。

1
Dxxg