ホーム 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の実データサイズを調べることができますので、ぜひご活用ください。

記事を共有

最近人気な記事