PostgreSQLテーブル一覧と件数取得方法|初心者向け完全ガイド

データベース・SQL

データベースを使っていると、「今どんなテーブルがあるんだっけ?」「このテーブルにはどのくらいデータが入っているんだろう?」と思うことがありますよね。

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自動生成機能を活用すると効率的です。

コメント

タイトルとURLをコピーしました