この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
DBを運用していると、どのテーブルが実際にどれくらいのファイルサイズなのかを知りたい場面があるかと思います。
そんな時、DBが使用している実データサイズを調べる方法を説明したいと思います。(データベース/テーブル)
今回はPostgreSQLが対象です。※9.1で確認しました。おそらく8系でも同じ方法かと思います
■ データベースの実データサイズを調べる
データベースにはそれぞれoidという識別子が設定されています。
そして、実際にデータが格納されているディレクトリ名にもこのoidが付いています。
ですので、このoidが分かれば、あとは該当のディレクトリのサイズを調べることで、データベースの実データサイズが分かるのです。
oidはpg_stag_databaseという稼働統計情報から調べることができます。
# select datid,datname from pg_stat_database;
datid | datname
--------+--------------------------------
1 | template1
12172 | template0
12180 | postgres
30310 | hoge
このdatidというのがデータベースのoidです。hogeデータベースのoidは30310ということになります。
次にPostgreSQLのデータディレクトリから30310という名前のディレクトリを探します。
※データディレクトリの場所は環境やinitdb時の指定により異なります。よく使われるのは/usr/local/pgsql/data/などでしょうか。
[/usr/local/pgsql9.1/data/base]$ du -sh ./*
5.7M ./1
5.7M ./12172
5.8M ./12180
32M ./30310
0B ./pgsql_tmp
duなどでディレクトリのファイルサイズを調べます。30310は32Mなので、hogeの実データサイズは32MBだと判明しました!
■ テーブルの実データサイズを調べる
テーブルの実データサイズの調べ方も基本はデータベースと同じです。
テーブルのoidを調べ、データディレクトリから同じidのディレクトリを探します。
oidはpg_classのrelfilenodeカラムで確認できます。
hoge=# select relfilenode,relname from pg_class order by relname;
relfilenode | relname
-------------+-----------------------------------------------------------------
11868 | _pg_foreign_data_wrappers
11877 | _pg_foreign_servers
11886 | _pg_foreign_tables
11896 | _pg_user_mappings
30311 | users
usersテーブルのoidは30311だと分かりました。あとは先程調べたhogeデータベースのデータディレクトリ内の同名ディレクトリのファイルサイズを調べればOKです。
[/usr/local/pgsql9.1/data/base/30310]$ du -sh ./* | grep 30311
16K ./30311
24K ./30311_fsm
grepすると2件ヒットしますが、30311_fsmの方はVACUUM で発見されたすべてのフリースペースが記録されているファイルですので今は無視してOKです。
ですので、上記よりusersテーブルの実データサイズは16KBと分かりました。
以上です。もっと簡単に調べることができれば便利なのですが・・・。
ともあれ、この方法でDBの実データサイズを調べることができますので、ぜひご活用ください。