2013-11-20 51 views
8

I作成したテーブル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しました。 ..しかし、マテリアライズド・ビューをチェックすると、新しいレコードはマテリアライズド・ビューに表示されません。私はperとして、高速かつ完全なリフレッシュのための手順を実行したときに

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 

さて、高速リフレッシュはMVIEWを更新しませんが、完全リフレッシュを行います。 (注:しかしMVIEWまだをCOMMIT最新の情報に更新される)

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. REWRITE -N-で
  5. PCT_TABLE -N-でOracleエラー: 詳細
  6. REFRESH_FAST_AFTER_INSERT -Y-は
  7. REFRESH_FAST_AFTER_ONETAB_DML -Y-は
  8. REFRESH_FAST_AFTER_ANY_DML -Y-は
  9. REFRESH_FAST_PCTためRELATED_NUMとRELATED_TEXTを参照してください - REWRITE_FULL_TEXT_MATCH -N-でクエリー・リライトをd
  10. 詳細についてはRELATED_NUMと RELATED_TEXTを参照してください。N-- PCTは、任意の詳細母校
  11. REWRITE_FULL_TEXT_MATCH -N-でのOracleエラーで のテーブルの上には不可能です にisabled
  12. REWRITE_PARTIAL_TEXT_MATCH -N-では-N-でクエリー・リライトを で無効になっているビューは にクエリー・リライトのいずれかのタイプをサポートすることはできません
  13. REWRITE_PARTIAL_TEXT_MATCHビュー
  14. REWRITE_GENERAL、-Nをマテリアライズドマテリアライズド・ビューをマテリアライズド - ビューが
  15. REWRITE_GENERAL -N-でのクエリー・リライトは、マテリアライズド・ビュー
  16. REWRITE_PCT -N-で一般的なリライトが可能かPCTないで無効になっている クエリー・リライトのいずれかのタイプをサポートすることはできませんマテリアライズドない は
  17. PCT_TABLE_REWRITEで可能です-N-でOracleエラーは:RELATED_NUMと詳細

ため RELATED_TEXTを参照してくださいどのように私は、コミット時に高速リフレッシュを達成することができますか?
詳細は、次のとおりです。
NLSRTL 10.2.0.4。0生産
のOracle Database 10g 10.2.0.4.0 64ビットの生産
PL/SQL 10.2.0.4.0生産
Linux用 TNS:10.2.0.4.0生産

+0

私のために働きます。問題を完全に再現できるように、 'マテリアライズド・ビュー・ログ... 'と挿入物を追加するとよいでしょう。 –

+0

データが表示されておらず、行を挿入した表も示されていません。 MVクエリを定義するSELECT文を実行すると、新しい行が表示されますか? –

+0

すべての挿入ステートメントが含まれています。はい、テーブルの挿入後に新しい行が表示されます。 –

答えて

1

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

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

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

は、DEPTから b.emp_no、a.rowid dept_rowid、b.rowid emp_rowid、a.dept_noを選択する上で、高速リフレッシュ としてROWID WITHコミットempdept_mvビュー、マテリアライズド作成のemp B どこa.dept_no = b.dept_no ;

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

2

それでも問題が解決しない場合、私は知らないが、私はあなたが提供articeで見ていたとして、私は(ちょうどここに解決策かもしれません)何かに気づい:

ONは、最新の情報に更新

をCOMMIT

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

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

その後、我々が持っている:DEMANDのリフレッシュ方法

マテリアライズド・ビューの定義問合せを再計算することによって更新オプションパラメータ説明 COMPLETE C リフレッシュON

表7-1に。

FAST F マテリアライズドビューに変更を徐々に適用してリフレッシュします。ローカル・マテリアライズド・ビューでは、リフレッシュ方式を選択します。これは、オプティマイザによって最も効率的と見積もられます。考慮されるリフレッシュ方法は、ログベースのFASTおよびFAST_PCTです。

FAST_PCT Pディテール表の変更されたパーティションの影響を受けたマテリアライズド・ビューの行を再計算することによってリフレッシュします。

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

  • 太字の線に注意してください。
  • 私は個人的にFORCEオプションを好みます。これはいくつかの時間後に再び発生した場合

あなたは(DBのパラメータとそれが実行するマシンに依存するので、私もどのくらいあなたをヒントすることはできません)、教えていただけますか?高速リフレッシュが可能な場合

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

マテリアライズド・ビューを高速リフレッシュをする方法がわからない場合は、高速リフレッシュを作成するために必要なステートメントを含むスクリプトは、マテリアライズド・ビューを提供しDBMS_ADVISOR.TUNE_MVIEW手順を、使用することができます。

乾杯

関連する問題