\dmコマンドでマテリアライズドビュー一覧を確認する

PostgreSQLでマテリアライズドビュー一覧を確認するには、psqlコマンドラインツールの\dmコマンドを使う。

testdb=# \dm
                 List of relations
 Schema |     Name      |       Type        | Owner
--------+---------------+-------------------+-------
 public | order_summary | materialized view | postgres
(1 row)

\dvが通常のビューだけを表示するのに対して、\dmはマテリアライズドビューだけを表示する。両者はCREATE VIEWCREATE MATERIALIZED VIEWという別のコマンドで作られる別種のオブジェクトである。

参考: 【PostgreSQL】ビュー一覧を確認する

\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)

ispopulatedfのマテリアライズドビューを参照しようとすると、データがまだない旨のエラーになる。

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を実行すると、その時点のクエリ結果でデータが投入され、ispopulatedtになる。

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か、relkindmを含めた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)

参考