0

Oracle 11g データベースには、アトミックでないときにすばやく完全に更新される MV がいくつかあります。新しい要件は、そうでなければならないことを意味します。

非アトミック DBMS_MVIEW.REFRESH が一連の挿入の前に切り捨てを実行するが、アトミック => true の場合、最初にすべてのレコードが 1 つずつ削除されることを理解しています。レコードを削除するだけでも 1 時間以上かかりますが、非アトミック バージョンでは数分しかかかりません。

この MV を更新している間も、この MV へのクエリを続行できるようにする方法が必要です。MV クエリはカウントを使用し、とにかくほとんどのレコードが変更されるため、FAST リフレッシュ方法は論外です。

したがって、私が思いついた構成は次のとおりです。

LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE;
SELECT * FROM FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2;
COMMIT;

LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE;
EXECUTE DBMS_MVIEW.REFRESH( 'FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2','cc');
COMMIT;

より良い方法はありますか?注意。私がパーティションの切り替えについて話し始めると、私のチーム リーダーは緊張します。:-)

4

1 に答える 1

0

あなたがパーティションの切り替えについて話し始めたとき、あなたのチーム リーダーは緊張していたことに気付きました。これは、チーム リーダーの懸念に対処できる場合に、パーティション分割オプションのライセンスを取得したことを示していますか? それとも、そのオプションを破棄する必要があることを示していますか?

パーティションの切り替えがオプションでない場合のアプローチは、あるテーブル (またはマテリアライズド ビュー) を指している状態から別のテーブルに切り替えるシノニムを持つことです。たとえば、

  • FOOBAR_MVIEW_DATA1に名前を変更FOOBAR_MVIEW_DATA1_BASE1
  • シノニムFOOBAR_MVIEW_DATA1を作成するFOOBAR_MVIEW_DATA1_BASE1
  • FOOBAR_MVIEW_DATA1_BASE2構造的に同じ空のテーブルを作成しますFOOBAR_MVIEW_DATA1_BASE1
  • FOOBAR_MVIEW_DATA1_BASE2マテリアライズド ビューを更新する場合は、事前に作成されたテーブルにデータを挿入してマテリアライズド ビューを作成します。
  • データが更新されたら、シノニムFOOBAR_MVIEW_DATA1をポイントしますFOOBAR_MVIEW_DATA1_BASE2
  • 将来、既存のクエリがすべて完了した時点で、切り捨てることができますFOOBAR_MVIEW_DATA1_BASE1。また、名前を変更FOOBAR_MVIEW_DATA1_BASE1して、マテリアライズド ビューの更新 (データがあり、空)FOOBAR_MVIEW_DATA1_BASE2の開始点が常に同じになるようにするか、更新コードを記述して、シノニムが指している場所を確認し、そうでないテーブルをロードすることもできます。シノニムによって参照されます。_BASE1_BASE2
于 2012-11-21T23:17:01.607 に答える