[PostgreSQL]テーブルのデータサイズを知りたい

テーブルのレコード数ではなくデータサイズを知りたいなと思う時があるかと思います。
PostgreSQLには pg_relation_sizepg_total_relation_size といったテーブルのデータサイズを返す関数があります。

前者(pg_relation_size)はテーブルのデータサイズを返し、後者(pg_total_relation_size)はデータに加えインデックスも含めたサイズを返します。

テーブルのデータサイズを求める

データサイズを求めるにはpg_relation_size関数を使います。

テーブル users のデータサイズを求めるには以下のSQLを実行します

select pg_total_size ('users')) AS "data_size";

実行結果

サイズの単位はbyteです。
サイズ表記をわかりやすくするには pg_size_pretty 関数を使います

select pg_size_pretty(pg_total_size ('users'))) AS "data_size";

実行結果

インデックスを含めたテーブルのデータサイズを求める

インデックスを含めたテーブルのデータサイズを求めるにはpg_total_relation_size関数を使います。

テーブル users のデータサイズを求めるには以下のSQLを実行します

select pg_size_pretty(pg_total_relation_size ('m_banks')) AS "total_size";

実行結果

データベース上のすべてのテーブルのデータサイズを求める

参考: How to Get Sizes of Database Objects in PostgreSQL

データベース上の全テーブルのデータサイズを求めるには以下のSQLを実行します

※サイズの大きい順に表示します

select
    N.nspname as "schema",
    C.relname AS "table",
    pg_size_pretty(pg_relation_size (C.oid)) AS "data_size",
    pg_size_pretty(pg_total_relation_size (C.oid)) AS "total_size"
FROM
    pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE
    nspname NOT IN (
        'pg_catalog',
        'information_schema'
    )
AND C .relkind <> 'i'
AND nspname !~ '^pg_toast'
ORDER BY
    pg_total_relation_size (C.oid) DESC;

実行結果