ProgrammingSQL 開発者 / データベース アーキテクト

SQLにはどのようなビュー(VIEW)のタイプがありますか?マテリアライズドビューはどのように機能し、通常のビューとは何が違いますか?どのような場合に使用することが正当化されますか?

Hintsage AIアシスタントで面接を突破

答え

SQLには2つのビューのタイプがあります:

  • 通常のビュー(View): 論理的な仮想テーブル。データを保存せず、ビューへのクエリは常に元のテーブルへのサブクエリを生成します。
  • マテリアライズドビュー(Materialized View): クエリの実行結果を物理的に別のテーブルに保存し、定期的に更新します。

通常のビューは、複雑さの抽象化、アクセスの簡素化、複数のソースからのデータの結合に便利です。常にその場で生成されるため、クエリの速度を向上させることはありません。

マテリアライズドビューは、複雑なレポートや分析においてパフォーマンスを向上させます。なぜなら、毎回集計や結合を待つ必要がないからです。データが古くならないように手動またはスケジュールに従って更新する必要があります。

通常のビューの例:

CREATE VIEW active_users AS SELECT id, name FROM users WHERE status = 'active';

マテリアライズドビューの例(PostgreSQL):

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がテーブルと同じように完全に更新可能であると誤解されることがよくあります。実際には:

  • 通常のビューは更新をほとんど許可しません:集計、グループ化、または複合/計算フィールドがない場合にのみ(JOINやサブクエリがない場合に限ります)。
  • マテリアライズドビューは基本的に直接更新できません — REFRESHを介してのみ更新可能で、さもなければデータの不整合が発生します。

知識の不足による実際のエラーの例


物語 1

BIレポートは、複数のJOINと集計を使用して通常のビューを介して構築されていました。負荷が増加した後、レポートの生成時間は数十分にまで増加しました。システムアナリストはマテリアライズドビューを提案し、それによりデータが別のテーブルに保存されることで、生成時間が瞬時に数秒に短縮されました。


物語 2

開発者はOracleへの移行時に通常のビューを介してUPDATEを試み、それによりエラーが発生しました:"view with group by is not updatable"。原因は、ビュー内でGROUP BYを使用していたことでした。


物語 3

ある会社では、新しいデータをインポートした後にマテリアライズドビューの更新を忘れることがあり、異なるユーザー間でレポートが不整合になる事態が発生しました。分析はこのビューの古いデータを使用していたためです。その後、スケジュールに従って自動的にREFRESHを追加しました。