postgresqlでデータベース、テーブルごとのサイズを取得する

やり方知らないから、いつも愚直に

> select pg_relation_size('table_name');
> select pg_database_size('db_name');

とかしてたんだけどまとめてさくっと概算値を取得したい場合はどうしたらいいか調べた。

データベースのサイズ取得

  • データベース名とOIDの取得

oid2nameを使うか次のSQLで。

> select datid,datname from pg_stat_database;
  • OIDごとの使用容量

$DATADIR/base/のデータを直接調べる。OIDごとのディレクトリが作られているので

$ cd $DATADIR/base
$ du -sk * 

とかする。後はOIDからデータベース名を紐付ける。

テーブルのサイズ取得

データベースのときとほぼ同じ。

  • テーブル名とOID取得

oid2name -d db_nameを実行するか次のSQLで。

> select relid,relname from pg_stat_all_tables;
  • OIDごとの使用容量
$ cd $DATADIR/base/
$ du -ah $db_oid/