データベースを使っていると、「今どんなテーブルがあるんだっけ?」「このテーブルにはどのくらいデータが入っているんだろう?」と思うことがありますよね。
PostgreSQLでは、システムカタログという特別なテーブルを使って、データベースの情報を調べることができます。
どんなときに使うの?

データベースの状況を把握したいとき
新しくプロジェクトに参加したときや、久しぶりにデータベースを触るときに、全体像を把握するために使います。
パフォーマンス調査をするとき
どのテーブルにたくさんデータが入っているかを調べて、処理が遅い原因を探すときに役立ちます。
データ移行やバックアップの計画を立てるとき
各テーブルのデータ量を把握して、作業時間を見積もるときに使います。
レポート作成やデータ分析のとき
データの規模を把握して、適切な分析方法を選ぶために確認します。
テーブル一覧を取得する方法

基本的なテーブル一覧の取得
まずは、データベースにどんなテーブルがあるかを調べてみましょう。
SELECT tablename
FROM pg_tables
WHERE schemaname = 'public';
説明: pg_tables
は、PostgreSQLが用意しているシステムビューです。このビューには、データベース内のすべてのテーブル情報が格納されています。
例: このクエリを実行すると、以下のような結果が表示されます。
tablename
-----------
users
products
orders
categories
より詳しい情報を含むテーブル一覧
テーブル名だけでなく、もう少し詳しい情報も一緒に見たい場合は、こちらを使います。
SELECT
schemaname AS スキーマ名,
tablename AS テーブル名,
tableowner AS 所有者
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename;
説明: この方法では、テーブルが属するスキーマ名、テーブル名、所有者の情報を一度に取得できます。
例: 実行結果は以下のようになります。
スキーマ名 | テーブル名 | 所有者
-----------+------------+--------
public | categories | postgres
public | orders | postgres
public | products | postgres
public | users | postgres
テーブルの件数を取得する方法

テーブルの一覧がわかったら、次は各テーブルにどのくらいデータが入っているかを調べてみましょう。PostgreSQLでは、いくつかの方法があります。
方法1: 統計情報を使った高速な件数取得
SELECT
relname AS テーブル名,
n_live_tup AS 推定件数
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
説明: pg_stat_user_tables
は、PostgreSQLが自動で収集している統計情報を表示するビューです。n_live_tup
は「生きているタプル(レコード)の数」という意味で、推定値を示します。
例: 実行結果は以下のようになります。
テーブル名 | 推定件数
------------+----------
orders | 15420
users | 3250
products | 850
categories | 12
メリット: とても高速で実行できます。 デメリット: あくまで推定値なので、正確な数値ではありません。
方法2: 正確な件数を個別に取得
正確な件数が必要な場合は、各テーブルに対してCOUNT(*)
を実行します。
-- usersテーブルの正確な件数
SELECT COUNT(*) FROM users;
-- productsテーブルの正確な件数
SELECT COUNT(*) FROM products;
-- ordersテーブルの正確な件数
SELECT COUNT(*) FROM orders;
説明: COUNT(*)
は、テーブル内のすべての行をカウントして、正確な件数を返します。
例: 各クエリを実行すると、以下のような結果が得られます。
-- usersテーブル
count
-------
3248
-- productsテーブル
count
-------
852
-- ordersテーブル
count
-------
15438
メリット: 100%正確な件数がわかります。 デメリット: テーブルが大きいと時間がかかります。
方法3: 件数取得用のSQLを自動生成
すべてのテーブルの正確な件数を効率よく調べたい場合は、SQLを自動生成する方法があります。
SELECT 'SELECT ''' || tablename || ''' AS テーブル名, COUNT(*) AS 件数 FROM ' || tablename || ';' AS 実行用SQL
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename;
説明: このクエリは、各テーブルの件数を取得するためのSQLを自動で作成します。出力されたSQLをコピーして実行すれば、正確な件数がわかります。
例: 実行すると、以下のようなSQLが生成されます。
実行用SQL
------------------------------------------------
SELECT 'categories' AS テーブル名, COUNT(*) AS 件数 FROM categories;
SELECT 'orders' AS テーブル名, COUNT(*) AS 件数 FROM orders;
SELECT 'products' AS テーブル名, COUNT(*) AS 件数 FROM products;
SELECT 'users' AS テーブル名, COUNT(*) AS 件数 FROM users;
実践的な活用例

データベース全体の概要を把握する
SELECT
t.tablename AS テーブル名,
COALESCE(s.n_live_tup, 0) AS 推定件数,
pg_size_pretty(pg_total_relation_size(c.oid)) AS テーブルサイズ
FROM pg_tables t
LEFT JOIN pg_stat_user_tables s ON t.tablename = s.relname
LEFT JOIN pg_class c ON t.tablename = c.relname
WHERE t.schemaname = 'public'
ORDER BY s.n_live_tup DESC NULLS LAST;
説明: このクエリでは、テーブル名、推定件数、テーブルのサイズを一度に取得できます。データベース全体の状況を素早く把握するのに便利です。
例: 実行結果は以下のようになります。
テーブル名 | 推定件数 | テーブルサイズ
------------+----------+--------------
orders | 15420 | 2432 kB
users | 3250 | 456 kB
products | 850 | 128 kB
categories | 12 | 8192 bytes
特定の条件でテーブルを絞り込む
-- 件数が1000件以上のテーブルのみ表示
SELECT
relname AS テーブル名,
n_live_tup AS 推定件数
FROM pg_stat_user_tables
WHERE n_live_tup >= 1000
ORDER BY n_live_tup DESC;
説明: 大量のデータを持つテーブルだけを調べたい場合に使います。
例: 実行結果では、1000件以上のデータを持つテーブルのみが表示されます。
スキーマを指定してテーブル情報を取得
-- 特定のスキーマのテーブル情報を取得
SELECT
schemaname AS スキーマ名,
tablename AS テーブル名,
COALESCE(n_live_tup, 0) AS 推定件数
FROM pg_tables t
LEFT JOIN pg_stat_user_tables s ON t.tablename = s.relname AND t.schemaname = s.schemaname
WHERE t.schemaname IN ('public', 'sales', 'inventory')
ORDER BY t.schemaname, s.n_live_tup DESC NULLS LAST;
説明: 複数のスキーマがある環境で、特定のスキーマのテーブルだけを調べたい場合に使います。
システムビューの詳細説明
pg_tablesビュー
PostgreSQLのすべてのテーブル情報を格納するシステムビューです。
主要なカラム:
schemaname
: テーブルが属するスキーマ名tablename
: テーブル名tableowner
: テーブルの所有者tablespace
: テーブルスペース名hasindexes
: インデックスがあるかどうか
pg_stat_user_tablesビュー
ユーザーが作成したテーブルの統計情報を格納するビューです。
主要なカラム:
relname
: テーブル名n_live_tup
: 推定レコード数(生きているタプル)n_dead_tup
: 削除済みレコード数(死んでいるタプル)n_tup_ins
: 挿入されたレコード数n_tup_upd
: 更新されたレコード数n_tup_del
: 削除されたレコード数
パフォーマンスを考慮した使い方

大きなテーブルでの注意点
推定値を活用する 数百万件のデータがあるテーブルでは、COUNT(*)
の実行に長時間かかる場合があります。正確な値が必要でなければ、pg_stat_user_tables
の推定値を使いましょう。
統計情報の更新 pg_stat_user_tables
の値は、データベースの統計情報収集に基づいています。より正確な推定値が欲しい場合は、以下のコマンドで統計を更新できます:
ANALYZE; -- すべてのテーブルの統計を更新
ANALYZE table_name; -- 特定のテーブルの統計を更新
バッチ処理での工夫 多数のテーブルの正確な件数を取得する場合は、ピーク時間を避けて実行するか、件数取得を複数回に分けて実行しましょう。
トラブルシューティング
統計情報が古い場合
pg_stat_user_tables
の値が実際の件数と大きく異なる場合は、統計情報が古い可能性があります。ANALYZE
コマンドで更新しましょう。
権限エラーが発生する場合
システムビューにアクセスする権限がない場合は、データベース管理者に相談してください。基本的に、テーブルの閲覧権限があれば統計情報も見ることができます。
特定のテーブルが表示されない場合
テンポラリテーブルやビューはpg_tables
には表示されません。すべてのリレーション(テーブル、ビュー、インデックスなど)を確認したい場合は、pg_class
ビューを使用してください。
方法別比較表
方法 | 速度 | 正確性 | 用途 | 注意点 |
---|---|---|---|---|
pg_stat_user_tables | とても速い | 推定値 | 全体把握、定期チェック | 統計更新が必要 |
COUNT(*)個別実行 | 遅い | 100%正確 | 正確な値が必要な場合 | 大きなテーブルは時間がかかる |
SQL自動生成 | 中程度 | 100%正確 | 複数テーブルを効率的に | 手動でSQLを実行する必要 |
information_schema | 中程度 | メタデータのみ | 標準SQL準拠が必要 | 件数は取得できない |
よくある質問

Q: pg_stat_user_tablesの推定値はどのくらい正確ですか?
A: 通常は実際の値の90-95%程度の精度です。ただし、大量の更新や削除があった直後は精度が下がることがあります。
Q: テンポラリテーブルの件数も取得できますか?
A: pg_stat_user_tables
ではテンポラリテーブルは表示されません。テンポラリテーブルはpg_stat_tmp_tables
ビューで確認できます。
Q: ビューの件数も調べられますか?
A: ビューには実際のデータが格納されていないため、件数の概念がありません。ビューの結果を知りたい場合は、直接SELECT COUNT(*) FROM view_name
を実行してください。
Q: 他のスキーマのテーブルも一緒に表示できますか?
A: はい。WHERE schemaname = 'public'
の条件を変更するか削除することで、他のスキーマのテーブルも表示できます。
まとめ
PostgreSQLでテーブル一覧と件数を取得する方法は、用途に応じて使い分けることが大切です。
素早く概要を把握したい場合はpg_stat_user_tables
を使い、正確な値が必要な場合はCOUNT(*)
を使いましょう。
大量のテーブルがある場合は、SQL自動生成機能を活用すると効率的です。
コメント