【PostgreSQL】各データベースの全テーブルのレコード件数を取得する

データ移行時にデータ欠損などが発生していないか各テーブルをレコード件数を数えることがあります。その際に一括でレコード件数を確認する方法をご紹介します。

pg_tablesというシステムテーブルに格納されている、ユーザーが作成したテーブルの名称を全件取得し、取得した各テーブルのレコードをCountします。

54.30. pg_tables

ファンクションの作成

CREATE OR REPLACE FUNCTION pg_temp.record_count()
RETURNS TABLE(objname TEXT, recordcount NUMERIC) AS $$
DECLARE
  cursor_tablename CURSOR FOR
    SELECT (schemaname || '.' || tablename) AS table_name
    FROM pg_tables
    WHERE
      schemaname !~ 'pg_*' AND
      schemaname != 'information_schema'
  ORDER BY table_name;
BEGIN
FOR rec_table IN cursor_tablename LOOP
    EXECUTE 'SELECT COUNT(*) FROM ' || rec_table.table_name INTO recordcount;
    objname := rec_table.table_name;
    RETURN NEXT;
  END LOOP;
  RETURN; END;
$$ LANGUAGE plpgsql;

実行クエリ

SELECT * FROM pg_temp.record_count();

実行結果

テスト環境で実行した件数は以下の通りです。

※ recordcount列が各テーブルのレコード件数です。

"objname","recordcount"
"public.customer","10000"
"public.test_table","1000"
"testuser.test_table","165480"

さいごに

このファンクションは、pg_tempスキーマに作成しているため、セッションが終了すると削除されます。

永続的に利用したい場合はpublicに作成頂く方が良いです。

執筆担当者プロフィール
森 尊臣

森 尊臣(日本ビジネスシステムズ株式会社)

ハイブリッドクラウド本部所属。 SQL ServerやAzureを中心としたシステムの設計・構築に携わっています。

担当記事一覧