6

SQL を再定義する必要があるマテリアライズド ビューがあります。db リンクを介してビューにアクセスする外部システムがあり、モンスター ビューはビュー内のデータを更新するのに 5 分かかります。ビューの SQL を再定義する方法を私が知っている唯一の方法は、それを削除して再作成することですが、外部システムがテーブルを見つけられなかったり、完全なデータ セットを持っていなかったりすると、非常に悪いことになります。ダウンタイムをできるだけ少なくする必要があります。

これをネイティブに、またはよりエレガントに行う方法はありますか:

  1. マテリアライズド ビューのパブリック シノニムを作成し、そのビューを使用するすべてのものが代わりにシノニムを使用するようにします。
  2. 新しい SQL で新しいマテリアライズド ビューを作成する
  3. シノニムを変更して、新しいビューを指すようにします
  4. 古いビューを削除します。

これを動的に行うためのコードを持っていますが、それは本当に醜くなっています。これを処理するためのより良い方法があるはずです。

4

1 に答える 1

7

Oracleには、そのためのソリューションが組み込まれています。mview 宣言は、テーブルの宣言とは別のものであることに注意してください。

元の mview

create materialized view mv1 as select dept , count(*) as cnt from scott.emp;

5 を超える部門のみが計算されるように宣言を変更します。

drop materialized view mv1 preserve table;

句に注意してPRESERVE TABLEください - テーブル mv1 は削除されません - mview レイヤーのみです。

desc mv1

ここで、既存のテーブルの上に別のクエリを使用して mview を作成します

create materialized view mv1 on prebuilt table as 
  select dept , count(*) as cnt from scott.emp where dept > 5;

on prebuilt table条項に注意してください。mview は既存のオブジェクトを使用しています。

exec dbms_mview.refresh_mview('mv1');
于 2013-08-24T07:15:24.523 に答える