SQLには2つのビューのタイプがあります:
通常のビューは、複雑さの抽象化、アクセスの簡素化、複数のソースからのデータの結合に便利です。常にその場で生成されるため、クエリの速度を向上させることはありません。
マテリアライズドビューは、複雑なレポートや分析においてパフォーマンスを向上させます。なぜなら、毎回集計や結合を待つ必要がないからです。データが古くならないように手動またはスケジュールに従って更新する必要があります。
CREATE VIEW active_users AS SELECT id, name FROM users WHERE status = 'active';
CREATE MATERIALIZED VIEW active_users_agg AS SELECT country, COUNT(*) as cnt FROM users WHERE status = 'active' GROUP BY country; -- 更新するには: REFRESH MATERIALIZED VIEW active_users_agg;
VIEW内のデータを更新できますか?それはビューのタイプによってどうなりますか?
VIEWがテーブルと同じように完全に更新可能であると誤解されることがよくあります。実際には:
REFRESHを介してのみ更新可能で、さもなければデータの不整合が発生します。物語 1
BIレポートは、複数のJOINと集計を使用して通常のビューを介して構築されていました。負荷が増加した後、レポートの生成時間は数十分にまで増加しました。システムアナリストはマテリアライズドビューを提案し、それによりデータが別のテーブルに保存されることで、生成時間が瞬時に数秒に短縮されました。
物語 2
開発者はOracleへの移行時に通常のビューを介してUPDATEを試み、それによりエラーが発生しました:"view with group by is not updatable"。原因は、ビュー内でGROUP BYを使用していたことでした。
物語 3
ある会社では、新しいデータをインポートした後にマテリアライズドビューの更新を忘れることがあり、異なるユーザー間でレポートが不整合になる事態が発生しました。分析はこのビューの古いデータを使用していたためです。その後、スケジュールに従って自動的にREFRESHを追加しました。