2011-08-09 35 views
11

私たちのアプリケーションの1つでは、1日に3回リフレッシュする大規模なマテリアライズド・ビューがあり、リフレッシュに7時間かかります。 (理想ではない、私は知っている)。これは、ユーザーとセッションがリフレッシュされている間にこのマテリアライズド・ビューにアクセスできないと確信していたので、私は困惑しましたが、明らかにそうすることができます。リフレッシュのタイプは、完全リフレッシュです。Oracle - マテリアライズド・ビューは、完全リフレッシュ中も引き続きアクセスできます。これはどのように作動しますか?

完全リフレッシュ中、私の理解では、既存のデータセットが削除され、クエリが再実行されます。これが当てはまる場合、マテリアライズド・ビューのリフレッシュ中にユーザー/その他のセッションがマテリアライズド・ビューにアクセスする方法は?

+0

これは、読み取り整合性のあるビューと呼ばれると思います。つまり、行が変更されると、元の行は、そのテーブルを照会していた場合に備えて、トランザクションの終了時までそのまま維持されます。 – Randy

答えて

15

アトミックリフレッシュまたは非アトミックリフレッシュを完全にリフレッシュできる2つの方法があります。原子リフレッシュは、単にマテリアライズド・ビュー内のすべての行を削除するためにDELETEを発行し、INSERTを実行して新しいデータを挿入します。これはすべて1つのトランザクション内で実行されるため、Oracleの標準マルチバージョン読取り一貫性アーキテクチャにより、リフレッシュが完了するまで他のセッションに古いデータが表示されます。非原子リフレッシュでは、Oracleはマテリアライズド・ビューでTRUNCATEを実行し、次にダイレクト・パスINSERTを実行して新しいデータを挿入します。これは実質的により効率的ですが、TRUNCATEはDDLであるため、リフレッシュ中に古いデータが他のセッションに表示されないことを意味します。

+0

偉大な答えは、ありがとう! – contactmatt

関連する問題