[SQLのはじめ方] Part26: ビュー(VIEW)とマテリアライズドビュー

SQL

はじめに

SQLの学習もいよいよ高度な内容に入ってきましたね!今回は、複雑なクエリをシンプルに見せたり、よく使う集計結果を保存しておいたりするのに便利な「ビュー(VIEW)」と「マテリアライズドビュー(Materialized View)」について学びます。

これらを使いこなせると、SQLの記述が楽になったり、データベースのパフォーマンスを改善したりできるので、ぜひマスターしましょう!💪

ビュー(VIEW)とは? 🤔

ビューは、一言で言うと「保存されたSELECT文」または「仮想的なテーブル」です。SELECT文の結果を、あたかも一つのテーブルのように扱えるように定義したものです。

ビュー自体は実際のデータを持っていません。ビューに対してクエリを実行すると、その都度、定義されたSELECT文が内部的に実行され、結果が返されます。

ビューの作成方法 (CREATE VIEW)

ビューはCREATE VIEW文を使って作成します。


CREATE VIEW ビュー名 AS
SELECT カラム1, カラム2, ...
FROM テーブル名
WHERE 条件式;
      

例:従業員テーブル(employees)から、東京本社勤務の従業員の名前と部署名を取得するビューを作成してみましょう。


-- employees テーブル (id, name, department, location)
-- departments テーブル (id, name) ※ 架空のテーブル

CREATE VIEW tokyo_employees AS
SELECT
    e.name AS employee_name,
    d.name AS department_name
FROM
    employees e
INNER JOIN
    departments d ON e.department_id = d.id
WHERE
    e.location = '東京本社';
      

これで、tokyo_employeesという名前のビューが作成されました。

ビューの使い方

ビューは通常のテーブルと同じようにSELECT文で参照できます。


SELECT * FROM tokyo_employees;
      

このクエリを実行すると、内部的にはCREATE VIEWで定義したSELECT文が実行され、東京本社勤務の従業員の名前と部署名が表示されます。

ビューのメリット ✨

  • 複雑なクエリの簡略化: 長くて複雑なJOINや集計を含むクエリをビューとして定義しておけば、あとは簡単なSELECT文で結果を取得できます。
  • セキュリティ向上: ユーザーにはビューへのアクセス権限のみを与え、元のテーブルへの直接アクセスを制限することで、見せたいデータだけを公開できます。
  • 再利用性の向上: よく使うクエリをビューにしておくことで、何度も同じクエリを書く手間が省け、コードの再利用性が高まります。

ビューのデメリット・注意点 ⚠️

  • パフォーマンス: ビューへのアクセスは、その都度定義されたSELECT文が実行されるため、元のクエリが複雑な場合はパフォーマンスが低下することがあります。
  • 更新制限: ビューに対するINSERT, UPDATE, DELETE操作は、ビューの定義(複数のテーブルをJOINしている、集約関数を使っているなど)によっては制限されるか、実行できない場合があります。
  • 依存関係: ビューは元のテーブルに依存しているため、元のテーブル構造が変更されるとビューが影響を受ける可能性があります。

マテリアライズドビュー(Materialized View)とは? 💾

マテリアライズドビューは、ビューと似ていますが、大きな違いは「クエリの結果を物理的に保存する」点です。ビューが仮想的なテーブルであるのに対し、マテリアライズドビューは「実体を持つテーブル」のようなものです。

クエリの結果を事前に計算して保存しておくため、参照時のパフォーマンスが非常に高速になります。ただし、元のデータが更新されても自動的には反映されず、手動またはスケジュールで「リフレッシュ(更新)」する必要があります。

注意 マテリアライズドビューの構文や機能は、使用するRDBMS(PostgreSQL, Oracleなど)によって異なります。MySQLには標準ではマテリアライズドビューの機能はありません(ただし、同様の仕組みをイベントスケジューラなどで実現することは可能です)。ここでは主にPostgreSQLを例に説明します。

マテリアライズドビューの作成方法 (CREATE MATERIALIZED VIEW)

PostgreSQLではCREATE MATERIALIZED VIEW文を使います。


-- PostgreSQL の例
CREATE MATERIALIZED VIEW ビュー名 AS
SELECT カラム1, カラム2, ...
FROM テーブル名
WHERE 条件式;
      

例:商品ごとの月間売上集計をマテリアライズドビューとして作成してみましょう。


-- sales テーブル (id, product_id, sale_date, amount) ※ 架空のテーブル

-- PostgreSQL の例
CREATE MATERIALIZED VIEW monthly_sales_summary AS
SELECT
    product_id,
    DATE_TRUNC('month', sale_date)::DATE AS sale_month,
    SUM(amount) AS total_amount,
    COUNT(*) AS sales_count
FROM
    sales
GROUP BY
    product_id,
    DATE_TRUNC('month', sale_date)
ORDER BY
    sale_month DESC,
    product_id;
      

これで、monthly_sales_summaryという名前で、集計結果が物理的に保存されたマテリアライズドビューが作成されました。

マテリアライズドビューの使い方

使い方はビューと同様で、通常のテーブルのようにSELECT文で参照できます。


SELECT * FROM monthly_sales_summary WHERE product_id = 101;
      

このクエリは、事前に計算され保存されている結果からデータを取得するため、非常に高速に動作します。

マテリアライズドビューの更新 (REFRESH)

元のテーブル(例:sales)のデータが更新されても、マテリアライズドビュー(monthly_sales_summary)は自動では更新されません。データを最新の状態にするには、REFRESH MATERIALIZED VIEW文を実行する必要があります。


-- PostgreSQL の例
REFRESH MATERIALIZED VIEW monthly_sales_summary;
      

このリフレッシュ操作は、データ量やクエリの複雑さによっては時間がかかる場合があります。そのため、夜間バッチなどで定期的に実行することが一般的です。

マテリアライズドビューのメリット 🚀

  • パフォーマンス向上: クエリ結果を物理的に保持するため、参照速度が大幅に向上します。特に、集計やJOINが複雑で時間のかかるクエリに対して効果的です。
  • 負荷分散: 参照クエリの負荷が元のテーブルではなくマテリアライズドビューにかかるため、元のテーブルへの負荷を軽減できます。

マテリアライズドビューのデメリット・注意点 ⚠️

  • データの鮮度: リフレッシュしない限りデータは更新されないため、常に最新のデータが必要な場合には向きません。
  • ストレージ消費: クエリ結果を物理的に保存するため、データ量に応じてストレージ容量を消費します。
  • 更新コスト: リフレッシュ処理には時間とリソースが必要です。元のデータ量が多い場合や頻繁な更新が必要な場合、リフレッシュの負荷が高くなります。
  • RDBMS依存: 標準SQLではなく、利用できるRDBMSが限られます(PostgreSQL, Oracle など)。
項目ビュー (View)マテリアライズドビュー (Materialized View)
実データ保持しない (仮想的)する (物理的)
参照時の動作定義されたSELECT文を実行保存されたデータを参照
参照パフォーマンス元のクエリに依存 (遅い場合あり)高速
データの鮮度常に最新 (クエリ実行時点)リフレッシュ時点 (遅延あり)
ストレージ消費ほぼなし (定義のみ)データ量に応じて消費
更新方法不要 (自動反映)リフレッシュが必要 (手動/定期的)
主なメリットクエリ簡略化、セキュリティ、再利用性参照パフォーマンス向上
主なデメリットパフォーマンス問題、更新制限データの遅延、ストレージ消費、更新コスト
対応RDBMSほとんどのRDBMS一部のRDBMS (PostgreSQL, Oracleなど)

使い分けのポイント 💡

ビューとマテリアライズドビューは、それぞれの特性を理解して使い分けることが重要です。

ビューが適しているケース

  • 複雑なクエリを単純化・再利用したい場合
  • 特定のユーザーに公開するデータを制限したい場合 (セキュリティ)
  • 常に最新のデータが必要な場合
  • 元のテーブルへの更新頻度が高い場合

マテリアライズドビューが適しているケース

  • 集計やJOINに非常に時間がかかるクエリの参照速度を改善したい場合
  • データの鮮度が多少古くても許容できる場合 (例: 日次レポート、バッチ処理)
  • 元のテーブルへの参照負荷を軽減したい場合
  • 使用しているRDBMSがマテリアライズドビューをサポートしている場合

まとめ

今回は、SQLの便利な機能である「ビュー」と「マテリアライズドビュー」について学習しました。
  • ビューは、SELECT文を保存し仮想テーブルとして扱う仕組みで、クエリの簡略化やセキュリティ向上に役立ちます。
  • マテリアライズドビューは、クエリ結果を物理的に保存し、参照パフォーマンスを向上させる仕組みですが、データの鮮度や更新コストに注意が必要です。
それぞれのメリット・デメリットを理解し、目的に合わせて適切に使い分けることで、より効率的でスマートなデータベース操作が可能になります。✨

これで Step 7 の内容は完了です! 次の Step 8 では、データベースの運用に欠かせないバックアップやユーザー管理、セキュリティについて学んでいきましょう!

コメント

タイトルとURLをコピーしました