关于PostgreSQL的视图和物化视图
视图是-
-
- 複雑な処理を1つの処理にまとめる機能である
-
- SELECT文を置き換えたもの。(つまり、SELECT ≒ ビュー)
-
- 実体としてのデータを持たないため、仮想的なテーブルとも呼ばれる。
-
- 実体としてのデータを持たない=ビューを実行するたびに、ビューに定義されたSELECT文を発行している。
-
- ビューの中にビューを定義することもできるが処理が遅くなる。
-
- メリット:
ビューを定義しておくことで毎回、複雑なSELECT文を書かなくて済む。
シンプルなSQL文を書くことができる。
効率化、セキュリティ的にメリットがある。
デメリット:
処理速度が遅い(データの実体を持たないため)
实体化视图是什么?
-
- ビューと同じように、複雑なSQL文のSELECT結果を頻繁に取得する場合に使用する機能。
-
- ビューは定義したSQL文で取得するデータを保持しない(データの実体がない)のに対し、マテリアライズドビューでは対象のデータをキャッシュし、実体として保持する。
-
- マテリアライズドビューではデータの実体を保持するため、元のテーブルが変更された場合は、マテリアライズドビューが保持していいる実体が古くなっているため、マテリアライズドビュー自体も更新しなければいけない。
-
- PostgreSQLではマテリアライズドビューの更新はREFRESH MATERIALIZED VIEWコマンドによって手動で行う(自動では行われない)。
-
- スナップショット。
-
- メリット:
マテリアライズドビューに定義したSELECT文の結果を常に持つ(データの実体を持つ)ため、ビューに比べて高速。
デメリット:
データの実体を持つため、マテリアライズドビュー作成後から実体のデータが古くなってしまう可能性がある。
それに対応するように、最新のものに更新するコマンドがある。作成方法もビューと多少異なる。
两者之间的区别
- SELECT文の置き換えで、SELECT結果を返すという役割は同じ
項目ビューマテリアライズドビュー処理速度遅早データ保持しないする参照時の処理SQLを発行し、結果を返す保持しているデータを返す主な利用目的セキュリティ確保などパフォーマンス向上など
创建、修改、删除视图
创建
格式:创建视图 视图名称 作为 查询语句;
postgres=# CREATE VIEW VIEW_DBLIST AS
postgres-# SELECT oid, datname
postgres-# FROM
postgres-# pg_database
postgres-# ;
改变
-
- ビューの変更方法は3通り
Create OR Replace VIEWコマンドを用いて変更する場合
ビューを削除して新たに作成する場合
ALTER VIEW
如果使用Create OR Replace VIEW命令进行更改
Create OR Replace VIEWに指定したビューが無ければ新たに作成し、ビューがあれば変更する
postgres=# CREATE OR REPLACE VIEW VIEW_DBLIST AS
postgres-# SELECT *
postgres-# FROM pg_database
postgres-# WHERE oid > 0
postgres-# ;
删除
postgres=# DROP VIEW VIEW_DBLIST;
创建、修改、删除实例化视图
创造
格式:CREATE MATERIALIZED VIEW <物化视图名称> AS <选择语句>;
postgres=# CREATE MATERIALIZED VIEW mymatview AS
postgres-# SELECT oid, datname
postgres-# FROM
postgres-# pg_database
postgres-# ;
更改
-
- マテリアライズドビューの変更方法は2通り
ALTER MATERIALIZED VIEW
マテリアライズドビューを削除して新たに作成する場合
修改物化视图的列(ALTER MATERIALIZED VIEW)
-
- マテリアライズドビューが所有するテーブルのカラム名を変更する
- 以下の例では、マテリアライズドビューが所有するテーブルのnameカラムをzoo_nameカラムに名前を変更する
postgres=# ALTER MATERIALIZED VIEW ビュー名 RENAME name TO zoo_name;
更新(刷新至最新的表格)
格式:刷新物化视图(MATERIALIZED VIEW)名称。
REFRESH MATERIALIZED VIEWコマンドを用いて変更する場合(最新のテーブルに更新)
postgres=# REFRESH MATERIALIZED VIEW VIEW VIEW_DBLIST;
删除
格式:删除物化视图 <物化视图名称>;
postgres=# DROP MATERIALIZED VIEW VIEW_DBLIST;