26.1. ディスク使用量の決定

各テーブルには、データの大部分が格納されるプライマリヒープディスクファイルが備わっています。 もしテーブルが、可能な限りの値を持つ列を持つ時は、テーブルに関連付けられたTOASTファイルもあります。 このファイルは、メインテーブルに収納するには大き過ぎる値をテーブルに格納するために使用されます(項52.2を参照してください)。 TOASTテーブルが存在する場合は、そのテーブルにインデックスが1つあります。 基本テーブルに関連付けられたインデックスが存在することもあります。 テーブルとインデックスはそれぞれ別のディスクファイルに格納されます。 このファイルが1ギガバイトを超える場合は、複数のファイルになります。 これらのファイルの命名規約について項52.1で説明します。

ディスクスペースの監視は、次の3つの方法で行えます。表9-48にあるSQL関数を使用する方法とVACUUM情報を使用する方法、およびcontrib/oid2nameを使用してコマンドラインから行う方法があります。 SQL関数を使用する方法が、テーブルやインデックスとlong value storage(TOAST)のついているテーブル、およびデータベースやテーブル空間の情報を取得するのに一番簡単です。

バキュームされて間もないデータベース、もしくは解析されたデータベース上でpsqlを使用することにより、どのようなテーブルでもディスクの使用量を調べるクエリを発行できます。

SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer';

 relfilenode | relpages 
-------------+----------
       16806 |       60
(1 row)

1ページは通常8キロバイトです (relpagesVACUUMANALYZE、さらに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

また、oid2nameを使ってディスク使用量を表示することもできます。使用例については、README.oid2nameを参照してください。 これには各データベースのディスク使用量を表示するスクリプトが含まれています。