この章では PostgreSQL データベースシステムのディスク使用量を監視する方法について説明します。
各テーブルには、データの大部分が格納されるプライマリヒープディスクファイルが備わっています。 もしテーブルが、可能な限りの値を持つ列を持つときは、テーブルに関連付けられた TOAST ファイルもあります。 このファイルは、メインテーブルに収納するには大きすぎる値をテーブルに格納するために使用されます(項49.2を参照してください)。 TOAST テーブルが存在する場合は、そのテーブルにインデックスが1つあります。 基本テーブルに関連付けられたインデックスが存在することもあります。 テーブルとインデックスはそれぞれ別のディスクファイルに格納されます。 このファイルが1ギガバイトを超える場合は、複数のファイルになります。 これらのファイルの命名規約について項49.1で説明します。
ディスクスペースの監視は、次の3つの方法で行えます。VACUUM情報を使用してpsqlから、contrib/dbsizeを使用してpsqlから、およびcontrib/oid2nameを使用してコマンドラインから行う方法があります。最近VACUUM (またはANALYZE)を実行したデータベースに対してpsqlを使用すると、問い合わせを発行して任意のテーブルのディスク使用量を表示することができます。
SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer';
relfilenode | relpages
-------------+----------
16806 | 60
(1 row)1ページは通常8キロバイトです。 (relpages はVACUUMとANALYZE、さらにCREATE INDEXといった幾つかのDDLによってによってのみ更新されることに注意してください。) relfilenodeの値は、テーブルのディスクファイルを直接調べるときに役に立ちます。
TOASTテーブルが使用している領域を示すために、次のような問い合わせを実行してみましょう。
SELECT relname, relpages
FROM pg_class,
(SELECT reltoastrelid FROM pg_class
WHERE relname = 'customer') ss
WHERE oid = ss.reltoastrelid
OR oid = (SELECT reltoastidxid FROM pg_class
WHERE oid = ss.reltoastrelid)
ORDER BY relname;
relname | relpages
----------------------+----------
pg_toast_16806 | 0
pg_toast_16806_index | 1
同様にして、インデックスの使用量も簡単に表示できます。
SELECT c2.relname, c2.relpages
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 'customer'
AND c.oid = i.indrelid
AND c2.oid = i.indexrelid
ORDER BY c2.relname;
relname | relpages
----------------------+----------
customer_id_indexdex | 26
この情報から、サイズのもっとも大きなテーブルとインデックスが簡単に見つけられます。
SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;
relname | relpages
----------------------+----------
bigtable | 3290
customer | 3144
contrib/dbsize は、VACUUM/ANALYZE を必要とすることなく、psql内からテーブルまたはデータベースのサイズを確認できる関数を、データベースにロードします。
また、oid2nameを使ってディスク使用量を表示することもできます。使用例については、README.oid2nameを参照してください。 これには各データベースのディスク使用量を表示するスクリプトが含まれています。