マテリアライズドビューがベーステーブルにクエリを実行するよりも望ましい理由は明らかです。それほど明確ではないのは、MVと同じデータを使用して別のテーブルを作成するだけの利点です。 MVの唯一の利点は、作成/保守の容易さだけですか?
MVは、一致するスキーマとMVのSELECTステートメントを使用したINSERT INTOを持つテーブルと同等ではありませんか?
つまり、次のようにMVを作成できます
CREATE MATERIALIZED VIEW ... AS
SELECT * FROM FOO;
また、同等のテーブルを作成できます。
CREATE TABLE bar (....);
INSERT INTO bar
SELECT * FROM FOO;
作成/保守の容易さだけでは十分ではないということは言うまでもありません。何も見逃さないようにしたいだけです。
動的クエリの書き換え 。マテリアライズドビューは関係を定義するだけでなく、高価な結合と集計を事前に計算することもできます。オプティマイザーは、MVがクエリで明示的に使用されていない場合(DB設定など)でも、MVを使用して関連データをフェッチするのに十分スマートです。
あなたの質問はOracleとタグ付けされましたが、MSSQLも同様のトリックを行います。
基本的には同等ですが、MVにはデータを自動的に更新するためのさまざまなオプションがあり、行ごとに変更を追跡できるため、メンテナンスの容易さだけでなく、場合によっては効率も向上します。
マテリアライズドビューは更新できます。これらは定期的に取得されたデータのスナップショットです。
2番目のステートメントは1回限りの取引です-データはその時点でTableに挿入されます。元のデータをさらに変更しても、テーブルには反映されません。
マテリアライズドビューの大きな利点は、挿入/更新/削除を犠牲にして事前に計算および保存されるため、集計データを非常に高速に取得できることです。データベースは、マテリアライズドビューと実際のデータの同期を維持します。ホイールを再発明する必要はありません。データベースに任せてください。
マテリアライズドビューは、依存するベースリレーションとの同期を維持します。
マテリアライズドビューが更新可能な場合、マテリアライズドビューを変更すると、依存するベースリレーションも変更されます。
すでに言及した利点に加えて:
言及したいのは:
他の回答に加えて(私はそれを見たことがないので)、どちらもスペースを使い果たしますが、マテリアライズドビューは論理的に正規化され、余分なテーブルは論理的に非正規化されます。これが一時的な一時的なものではない場合、ベーステーブルを更新するたびに2番目のテーブルを更新することを忘れないでください。
1)書き込み操作の高速化:マテリアライズドビューでインデックスを作成できるため、それらからの読み取りは非常に高速です。大量の書き込みを含むテーブルにインデックスを作成すると、インデックスメンテナンスのオーバーヘッドにより書き込みプロセスが遅くなる傾向があることに注意してください。これを回避するには、マテリアライズビューを作成し、それらにインデックスを作成します。これらのインデックスはバックグラウンドで維持でき、テーブルの書き込み操作に悪影響を与えません。
2)読み取り操作の高速化:複雑な結合。実行に時間がかかるピボットは、マテリアライズドビューにインデックスを作成することで高速化できます。これは、ほとんどのレポートシナリオで非常に便利になります。
TableとMVの違いはtableであり、他のユーザーに表示されるDML操作を実行できますが、MVに加えた変更は、データベースサーバーを更新するまで他のユーザーには利用できません。
複雑なクエリを使用して複数のテーブルに基づいてMVを構築すると、MVには別の利点があります。MVを使用すると、パフォーマンスが大幅に向上します。
正しい比較は次のようになります。
REFRESH MATERIALIZED VIEW bar;
対:
CREATE TABLE bar (....);
INSERT INTO bar
SELECT * FROM FOO;
MVを一度作成すれば、選択を行う必要があるときに更新できます(情報が頻繁に変更されることがわかっている場合は、一部の呼び出しも不要です)
また、MVを提供してインデックスを作成することもできますが、これは他の方法がないものです。もちろん、大きな結果セットに対してのみMVのパフォーマンスが優先されます。
Postgresでは、これも実行できます。
REFRESH MATERIALIZED VIEW CONCURRENTLY bar;
一方が終了せず、もう一方がその時点までの情報を必要とする場合、2つの並列プロセスで更新します。実行中のクエリからのものを再利用するために、いくつかの最適化が行われたと思います。
これは、SELECT INSERT INTOではできません。
実際には、マテリアライズビューは、更新された結果セットを表示するために定期的に集計が必要なテーブルよりも最良の選択です。複雑なクエリを毎回使用するのではなく、在庫モジュールのデータウェアハウジング以外のマテリアライズドビューを使用して、毎日、毎週、毎月の在庫を決算残高で計算することができます。