postgre のデータサイズ確認系SQL

DBサイズ一覧
select datname, pg_size_pretty(pg_database_size(datname)) from pg_database ORDER BY datname;
テーブル、インデックスサイズ一覧

(postgre 9.1.1で確認。古いバージョン(8.3.1)だとエラー)

SELECT
 relname,
 reltuples,
 pg_size_pretty(pg_table_size(oid)) as tablesize,
 pg_size_pretty(pg_indexes_size(oid)) as indexsize
FROM pg_class
WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public')
  and relkind in ('r', 't');

インデックスも各々別行で出るパターン
(こっちは9.1.1でも8.3.1でも動いた)

SELECT
 relname,
 reltuples,
 pg_size_pretty(pg_relation_size(oid)) as size
FROM pg_class
WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');

更に、pg_class.relkind で絞り込み可能。(rは通常のテーブル、iはインデックス、Sはシーケンス、vはビュー、mはマテリアライズドビュー、 cは複合型、tはTOASTテーブル、fは外部テーブル)


参考

2014/07/28 追記
上記のクエリは名前空間を public に固定しているが、そうでないケースは以下のようにする。

SELECT
 relname,
 nspname,
 reltuples,
 pg_size_pretty(pg_table_size(cl.oid)) as tablesize,
 pg_size_pretty(pg_indexes_size(cl.oid)) as indexsize
FROM pg_class cl, pg_namespace ns
WHERE
 cl.relnamespace=ns.oid
 AND relkind in ('r', 't')
 AND reltuples>0
 AND nspname not like 'pg_%'
 AND nspname != 'information_schema';

2015/04/23 追記
relkind = 'r' に対して pg_table_size と pg_relation_size は同じ値を返しそうなものだが、微妙に違う値が返ってきて謎…