28009


特定のモデルがどの程度の容量を消費するかを確認するために生成されたインスタンスとそのモデルが`has_many`で持つ関連付けられたものを含めたディスク容量を取得する方法はありますか？

例えば

[code]

    class User < ActiveRecord::Base
      has_many :posts
    end
    
[/code]

とある時に`post`に1万件テストデータを入れて実際にどの程度のバイト数を消費するのかを確認したく思っています。

環境はPostgresqlです。


CC BY-SA 3.0
2016-07-31T20:12:22.113
27986
2016-08-02T01:40:30.937
2016-08-02T01:28:24.077
76
3271
question
ruby-on-rails postgresql
特定のモデルのインスタンスのディスク容量を調べる方法


テーブルの各列のデータサイズ (`INTEGER` なら4バイト、`TEXT` なら4バイト+長さ、など)
を合計したものに各種メタ情報の容量を追加することで一応求めることは可能です。実際のディスク容量を計算する場合には、さらにパディング情報も考慮する必要があるかもしれません。

厳密に求めようとするとかなり面倒なので、ある程度割り切って概算してしまうのが良いと思います。

少し情報は古いですが、データファイルの内部構造と容量計算については以下のPDFに詳しいです。(これ以上詳しい情報はソースコードを読むくらいしか無いと思います)  
<http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol24_214-221.pdf>

実際には、想定データ (一部圧縮されるデータがあるので、実際に利用されるデータに近いものが望ましい)
を大量に突っ込んでサイズを計測するのが楽な気はしますが。


CC BY-SA 3.0
2016-08-02T01:29:24.987
28008
2016-08-02T01:29:24.987
76
27986
answer


pg_class テーブルの relpages がブロック数(8KiB単位 / `show block_size;`で確認) で reltuples
が行数、ということで、雰囲気を掴むレベルであれば

[code]

    VACUUM;
    SELECT relpages * 8192 / reltuples FROM pg_class WHERE relname = 'posts';
    
[/code]

くらいでもよいかも知れません。

インデックスなどレコードデータ以外のメタ情報もあるので `WHERE relname like '%posts%'`
とかして、当てはまるものを合計する必要はあるでしょう。

実際には行をいくつか追加して、前後の増減も見てみたらよいと思います。


CC BY-SA 3.0
2016-08-02T01:40:30.937
28009
2016-08-02T01:40:30.937
17037
27986
answer