SQLビューとマテリアライズドビュー

クエリの抽象化、セキュリティ、パフォーマンスのためのSQLビューとマテリアライズドビューの作成方法を学びます。更新可能ビューとリフレッシュ戦略を詳しく解説します。

DDL

詳細な説明

SQLビューとマテリアライズドビュー

ビューはSQLクエリで定義される仮想テーブルです。抽象化を提供し、複雑なクエリを簡素化し、特定のデータのみをユーザーに公開することでセキュリティを強化します。

ビューの作成

CREATE VIEW active_employees AS
SELECT e.id, e.name, e.email, d.dept_name, e.salary
FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE e.is_active = true;

SELECT * FROM active_employees WHERE dept_name = 'Engineering';

更新可能ビュー

シンプルなビューはINSERT、UPDATE、DELETEをサポートできます:

CREATE VIEW engineering_team AS
SELECT id, name, email, salary
FROM employees
WHERE department = 'Engineering'
WITH CHECK OPTION;

UPDATE engineering_team SET salary = salary * 1.1 WHERE name = 'Alice';

WITH CHECK OPTION により、ビューを通じた変更がビューのWHERE条件を引き続き満たすことが保証されます。

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

マテリアライズドビューはクエリ結果を物理的に格納し、鮮度とパフォーマンスのトレードオフを実現します:

CREATE MATERIALIZED VIEW monthly_sales_summary AS
SELECT DATE_TRUNC('month', sale_date) AS month,
       product_category,
       SUM(amount) AS total_sales,
       COUNT(*) AS transaction_count
FROM sales
GROUP BY DATE_TRUNC('month', sale_date), product_category;

REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales_summary;

ビューとマテリアライズドビューの比較

機能 ビュー マテリアライズドビュー
ストレージ なし(仮想) 物理的
パフォーマンス 基となるクエリと同じ 高速(事前計算済み)
データの鮮度 常に最新 リフレッシュまで古い
インデックス作成 不可 可能
用途 抽象化、セキュリティ レポート、ダッシュボード

ビューによるセキュリティ

CREATE VIEW public_products AS
SELECT name, description, price FROM products WHERE is_published = true;

GRANT SELECT ON public_products TO readonly_role;

ベストプラクティス

  • 複数のクエリで再利用される複雑なJOINやサブクエリを簡素化するためにビューを使用する
  • 深くネストされたビュー(ビューがビューを参照し、さらにビューを参照する)はデバッグが困難になるため避ける
  • 頻繁にアクセスされるコストの高い集約にはマテリアライズドビューを使用する
  • マテリアライズドビューのリフレッシュはトラフィックの少ない時間帯にスケジュールする
  • ベーステーブルと区別するために、ビューにはわかりやすい名前を付ける

ビューは、データベースの抽象化、アクセス制御、クエリの簡素化に不可欠なツールです。

ユースケース

レポートダッシュボードが、日次の売上集約を事前計算するマテリアライズドビューを使用して、毎時のスケジュールリフレッシュでダッシュボードの読み込み時間を30秒から1秒未満に短縮する場面。

Try It — SQL Formatter

フルツールを開く