その他
    ホーム 技術発信 DoRuby DBの実データサイズを調べる(PostgreSQL編)

    DBの実データサイズを調べる(PostgreSQL編)

    この記事はアピリッツの技術ブログ「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の実データサイズを調べることができますので、ぜひご活用ください。

    記事を共有