各テーブルがどのくらいの容量を使用しているか調べる

PostgreSQLで、各テーブルが管理上、また実ファイル上何バイト利用しているかを調べます。

# test_dbの各テーブルのサイズを取得します。
# ※ テーブル名 管理上テーブルサイズ 実ファイルサイズ のタブ区切りの形式で出力します。
# ※ 分割テーブルの場合、12345.1, 12345.2 のように、「.番号」が付くファイルが存在するため、対応できていません。

psql -U postgres -d test_db -tAF, -c "
select
  c.relname, c.reltuples as rows, (c.relpages::int8 * 8192) as size_kb, c.relfilenode, db.oid as db_oid
from
  pg_class c, (select oid from pg_database where datname = current_database()) db
where
  relnamespace not in (
    select oid from pg_namespace 
    where nspname in ('pg_catalog', 'pg_toast', 'pg_temp_1', 'information_schema')
  )
  and relkind = 'r'
order by
  relname
;
" | perl -ne 'chomp; split/,/; print $_[0]."\t".$_[2]."\t".(-s $ENV{"PGDATA"}."/base/".$_[4]."/".$_[3])."\n";'
<<<