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は外部テーブル)
参考
- http://www.lovebug.jp/index.php?PostgreSQL%2F8.x%2F%C1%B4%A4%C6%A4%CE%A5%C7%A1%BC%A5%BF%A5%D9%A1%BC%A5%B9%A4%CE%A5%D5%A5%A1%A5%A4%A5%EB%A5%B5%A5%A4%A5%BA%A4%F2%BC%E8%C6%C0%A4%B9%A4%EBSQL
- http://d.hatena.ne.jp/y-kawaz/20090226/1235623336
- http://www.postgresql.jp/document/9.1/html/functions-admin.html
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 は同じ値を返しそうなものだが、微妙に違う値が返ってきて謎…