\dmコマンドでマテリアライズドビュー一覧を確認する
PostgreSQLでマテリアライズドビュー一覧を確認するには、psqlコマンドラインツールの\dmコマンドを使う。
testdb=# \dm
List of relations
Schema | Name | Type | Owner
--------+---------------+-------------------+-------
public | order_summary | materialized view | postgres
(1 row)
\dvが通常のビューだけを表示するのに対して、\dmはマテリアライズドビューだけを表示する。両者はCREATE VIEWとCREATE MATERIALIZED VIEWという別のコマンドで作られる別種のオブジェクトである。
\dm+でサイズやアクセスメソッドも表示する
+を付けるとサイズなどの詳細な列が追加される。
testdb=# \dm+
List of relations
Schema | Name | Type | Owner | Persistence | Access method | Size | Description
--------+---------------+-------------------+-------+-------------+---------------+-------+-------------
public | order_summary | materialized view | postgres | permanent | heap | 16 kB |
(1 row)
マテリアライズドビューは通常のビューと異なり、クエリ結果を実データとしてディスクに保持するため、Size列に実際の使用量が表示される。
pg_matviewsでマテリアライズドビュー一覧と状態を確認する
pg_matviewsシステムビューでは、一覧に加えてデータが投入済みかどうかを示すispopulated列も取得できる。
testdb=# SELECT schemaname, matviewname, ispopulated
testdb-# FROM pg_matviews
testdb-# WHERE schemaname = 'public';
schemaname | matviewname | ispopulated
------------+---------------+-------------
public | order_summary | t
(1 row)
CREATE MATERIALIZED VIEW ... WITH NO DATAで作成した直後は、定義だけが存在してデータがまだ投入されていない状態になる。
testdb=# CREATE MATERIALIZED VIEW order_summary_empty AS
testdb-# SELECT user_id, sum(amount) AS total FROM orders GROUP BY user_id
testdb-# WITH NO DATA;
testdb=# SELECT schemaname, matviewname, ispopulated
testdb-# FROM pg_matviews
testdb-# WHERE schemaname = 'public';
schemaname | matviewname | ispopulated
------------+---------------------+-------------
public | order_summary | t
public | order_summary_empty | f
(2 rows)
ispopulatedがfのマテリアライズドビューを参照しようとすると、データがまだない旨のエラーになる。
testdb=# SELECT * FROM order_summary_empty;
ERROR: materialized view "order_summary_empty" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command.
REFRESH MATERIALIZED VIEWを実行すると、その時点のクエリ結果でデータが投入され、ispopulatedもtになる。
testdb=# REFRESH MATERIALIZED VIEW order_summary_empty;
testdb=# SELECT * FROM order_summary_empty;
user_id | total
---------+---------
2 | 1500.00
1 | 3000.00
(2 rows)
集計処理などで一時的に空のマテリアライズドビューを作成しておき、後からまとめてREFRESHする運用をしている場合、ispopulatedで投入済みかどうかを機械的に判定できる。
information_schema.viewsにはマテリアライズドビューが含まれない
標準SQLのinformation_schema.viewsは通常のビューだけを対象としており、マテリアライズドビューは含まれない。
testdb=# SELECT table_schema, table_name
testdb-# FROM information_schema.views
testdb-# WHERE table_schema = 'public';
table_schema | table_name
--------------+-------------
public | user_orders
(1 row)
order_summary(マテリアライズドビュー)は結果に含まれず、user_orders(通常のビュー)だけが表示される。マテリアライズドビューは標準SQLで定義された概念ではなくPostgreSQL独自の拡張機能であるため、標準SQL準拠のinformation_schemaには現れない。マテリアライズドビューも含めて調査する場合はpg_matviewsか、relkindにmを含めたpg_classを使う。
testdb=# SELECT n.nspname, c.relname
testdb-# FROM pg_class c
testdb-# JOIN pg_namespace n ON n.oid = c.relnamespace
testdb-# WHERE c.relkind IN ('v', 'm')
testdb-# AND n.nspname = 'public'
testdb-# ORDER BY 1, 2;
nspname | relname
---------+---------------
public | order_summary
public | user_orders
(2 rows)
