ビューとは?
一言で言うと、「仮想テーブル」です。
指定のSELECT文の結果を、あたかもテーブルかのように扱うことができる仕組みです。
ビューの利点
複雑なSELECT文を都度書かずに済みます。
ビューの欠点
処理速度が遅いことです。
ビューは実体としてのデータを持たないため、
上記クエリを実行するたびに、
ビューに定義されたSELECT文に置き換えられて実行されることになります。
ビューの作成構文
CREATE VIEW ビュー名 AS SELECT文;
実際の例
下記のビューを作成してみるとします。
CREATE VIEW test_view AS
SELECT t1.id, t1.name, t1.age, t2.address, t2.city, t3.job
FROM sample_table1 AS t1
JOIN sample_table2 AS t2 ON t1.id = t2.id
JOIN sample_table3 AS t3 ON t1.id = t3.id
WHERE t1.age < 25 AND t2.city = '東京';
これにより、「AS」以降に記載したSELECTをその都度書かなくても、下記の簡単なクエリで実行できるようになります。
select * from test_view;
なお、注意点として、ビューはREAD専用であり、ビューに対してINSERT、UPDATE、DELETEはできません。
また、ビューへの参照権限があれば、元のテーブルへの参照権限は不問です。
マテリアライズドビューとは?
PostgreSQLにはマテリアライズドビューという仕組みもあります。略してマテビューと呼びます。
PostgreSQL 9.3から実装されました。
ビューはデータの実体を持たないのに対し、
マテリアライズドビューでは対象のデータをキャッシュし、実体として保持することが特徴です。
マテビューの利点
・複雑なSELECT文を都度書かずに済みます。
・データの実体を持つ分、ビューより処理が高速です。
マテドビューの欠点
・元のテーブルが変更された場合、マテリアライズドビューが保持する実体は古いままであり、手動で更新する必要があります。
マテビューの作成構文は下記です。
MATERIALIZEDと書く以外は、ビューの作成と同じです。
CREATE MATERIALIZED VIEW マテリアライズドビュー名 AS SELECT文;
実際の例
下記のマテビューを作成してみるとします。
CREATE MATERIALIZED VIEW test_mate_view AS
SELECT t1.id, t1.name, t1.age, t2.address, t2.city, t3.job
FROM sample_table1 AS t1
JOIN sample_table2 AS t2 ON t1.id = t2.id
JOIN sample_table3 AS t3 ON t1.id = t3.id
WHERE t1.age < 25 AND t2.city = '東京';
件数を出してみると、8件でした。
select count(*) from test_mate_view;
この8件のデータのうち、2件のレコードを削除し、再度実行しても、変わらず8件のままです。
テーブルの実体をマテビューに反映するには、以下のコマンドを実行する必要があります。
REFRESH MATERIALIZED VIEW マテリアライズドビュー名;
今回の場合は、
REFRESH MATERIALIZED VIEW test_mate_view;
select count(*) from test_mate_view;
を再度実行すると、6件取得されました。
マテビューの補足
PostgreSQLのマテリアライズドビューの更新(REFRESH MATERIALIZED VIEW)は、
完全リフレッシュといって、全てのレコードを更新し直す挙動になります。
OracleDBでは増分のみのリフレッシュを行うことも可能ですが、PostgreSQLでは未実装の機能であります。