目次
ビューとマテリアライズド・ビューの違いのまとめ
| データ保存 | クエリ速度 | データ鮮度 | |
|---|---|---|---|
| ビュー | なし(都度実行) ストレージ不要 |
基になるテーブルに依存 | 常に最新 |
| マテリアライズド・ビュー | あり(結果を物理保存) ストレージ必要 |
速い | リフレッシュが必要 |
ビューを使うべき時
- データが頻繁に更新され、常に最新の状態を見る必要がある。
- 元のテーブルがそれほど大きくなく、検索パフォーマンスに問題がない。
- 特定の列を隠すなど、セキュリティ的な窓口として使いたい。
マテリアライズド・ビューを使うべき時
- 数千万件以上のデータを集計するような、重いクエリの結果を高速に返したい。
- データがリアルタイムで最新である必要はない(例:1時間前のデータでも許容できる)。
ビューとは
ビューとは、SELECTクエリに名前をつけて保存したものです。
テーブルのように見えますが、実際のデータは保存されておらず、参照するたびにクエリが実行されます。
基本的な使い方
-- ビューの作成
CREATE VIEW active_users AS
SELECT
user_id,
user_name,
email
FROM users
WHERE status = 'active';
-- ビューの参照(通常のテーブルと同じように使える)
SELECT * FROM active_users;
-- ビューの削除
DROP VIEW active_users;
8行目は、usersテーブルの中からstatus列の値がactiveである行だけを取得するという条件です。
不要なデータを隠すことができます。
特徴
| クエリの簡略化 | 複雑なSQLをビューとして定義しておくことで、シンプルなSELECTで呼び出せる |
| セキュリティ | 特定の列や行だけを見せるビューを作成し、元テーブルへのアクセスを制限できる |
| 保守性 | ビューを修正するだけで、そのビューを使う全クエリに変更が反映される |
デメリット
基になるテーブル(基底テーブル)が巨大な場合や、複雑な結合(JOIN)が含まれる場合、実行のたびに計算が行われるため応答が遅くなる。
マテリアライズド・ビューとは
マテリアライズドビューとは、クエリの結果を物理的に保存したデータベースオブジェクトです。
通常のビュー(View)がクエリを毎回実行するのに対し、マテリアライズドビューは結果をあらかじめ計算・保存しておきます。
基本的な使い方
-- マテリアライズドビューの作成
CREATE MATERIALIZED VIEW sales_summary AS
SELECT
product_id,
SUM(amount) AS total_sales,
COUNT(*) AS order_count
FROM orders
GROUP BY product_id;
-- クエリ(通常のテーブルと同じように使える)
SELECT * FROM sales_summary WHERE total_sales > 10000;
-- 手動リフレッシュ
REFRESH MATERIALIZED VIEW sales_summary;
特徴
| 高速なクエリパフォーマンス | 集計・結合などの重い処理を事前に計算しておくため、クエリが大幅に速くなります。 |
デメリット
基になるテーブルが更新されても、マテリアライズド・ビュー側には自動で即時反映されない(リフレッシュ操作が必要)。そのため、データが古くなる可能性がある。
主要DBのビューとマテリアライズド・ビューの実装状況
| 項目 | Redshift | PostgreSQL | MySQL | Oracle |
|---|---|---|---|---|
| ビューの基本概念 | 同じ | 同じ | 同じ | 同じ |
| マテリアライズドビュー | ◯ あり | ◯ あり | ❌ なし | ◯ あり |
| 自動リフレッシュ | ◯ あり | ❌ なし | - | ◯ あり |
| インクリメンタルリフレッシュ | ◯ あり | ❌ なし | - | ◯ あり |
| 自動クエリ書き換え | ◯ あり | ❌ なし | - | ◯ あり |
自動リフレッシュ
ベーステーブルのデータ変更を検知して自動的に更新します。
PostgreSQLは自動リフレッシュがないため手動で更新します。
インクリメンタルリフレッシュ
変更分だけを更新する差分リフレッシュに対応しており、全件再計算より効率的です。
自動クエリ書き換え(Automatic Query Rewriting)
マテリアライズドビューが存在する場合、元テーブルへのクエリを自動的にマテリアライズドビューへ書き換えてくれます(ユーザーが意識しなくてもOK)。
関連の記事
