この章では PostgreSQL データベースシステムのディスク使用量を監視する方法について説明します。 現行リリースでは、データベース管理者はディスク上の領域のレイアウトについてはあまり制御できません。 ですから、この章ではオペレーティングシステムツールを使用してディスク使用量を管理する方法についての有益な情報となり、また、ヒントを提供します。
各テーブルには、データの大部分が格納されるプライマリヒープディスクファイルが備わっています。 また、列にある長い値を格納するためには、テーブルに関連付けられた TOAST ファイルと、TOAST テーブルのインデックスも備わっています。 TOAST ファイルは、テーブルの OID (実際には pg_class.relfilenode) に基づいた名前になります。 基本テーブルに関連付けられたインデックスが存在することもあります。
ディスク領域の監視は、次の3つの方法で行えます。 VACUUM情報を使用してpsqlから、contrib/dbsizeを使用してpsqlから、およびcontrib/oid2nameを使用してコマンドラインから行う方法があります。 最近バキューム、もしくは解析されたデータベースに対して、psqlから以下の問い合わせを発行して任意のテーブルのディスク使用量を表示することができます。
SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer'; relfilenode | relpages -------------+---------- 16806 | 60 (1 row)
1ベージは通常8キロバイトです。(relpages はVACUUMとANALYZEによってのみ更新されることに注意してください。)
TOASTテーブルによって使用されている領域を表示するには、以下のような問い合わせを、(上記問い合わせで決定される)ヒープ番号relfilenodeで置き換えて、使用します。
SELECT relname, relpages FROM pg_class WHERE relname = 'pg_toast_16806' OR relname = 'pg_toast_16806_index' 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内からテーブルまたはデータベースのサイズを確認できる関数を、データベースにロードします。
また、contrib/oid2nameを使ってディスク使用量を表示することもできます。 使用例については、このディレクトリ内のREADME.oid2nameを参照してください。 これには各データベースのディスク使用量を表示するスクリプトが含まれています。