占有されているディスク容量
ディスク上のスペースの計算は簡単ではありません。考慮に入れる必要があります:
-
テーブルごとのオーバーヘッド(小さい、基本的にシステムカタログのエントリは、Herokuでは影響しない場合があります)。
-
オーバーヘッド 行ごと(HeapTupleHeader)およびデータページごと(PageHeaderData)。マニュアルのページレイアウトの詳細。
-
データ型の配置でスペースが失われました 。
-
NULLビットマップ用のスペース 。 8列以下のテーブルでは事実上無料で、ケースには関係ありません。
-
デッドロー
UPDATE
の後 /DELETE
。 -
インデックスのサイズ 。主キーがありますよね?インデックスのサイズは、インデックス付きの列だけでオーバーヘッドが少ないテーブルのサイズと似ています。
-
それぞれのデータ型に応じた、データの実際のスペース要件 。マニュアルの文字タイプ(固定長タイプを含む)の詳細:
短い文字列(最大126バイト)のストレージ要件は、1バイトに実際の文字列を加えたものです。これには、
character
の場合のスペースパディングが含まれます。 。長い文字列には、1ではなく4バイトのオーバーヘッドがありますシステムカタログ
pg_type
のすべてのタイプの詳細 。 -
データベースのエンコーディング 特に文字タイプの場合。 UTF-8は最大4バイトを使用して1文字を格納します(ただし、UTF-8でも、7ビットASCII文字は常に1バイトしか占有しません)。
-
TOAST など、ケースに影響を与える可能性のあるその他の小さなもの --64文字の文字列では影響しません。
テストケースで計算
見積もりを見つける簡単な方法は、テストテーブルを作成し、ダミーデータを入力して、データベースオブジェクトサイズ関数で測定することです::
SELECT pg_size_pretty(pg_relation_size('tbl'));
インデックスを含む:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
簡単なテストでは、次の結果が示されます。
CREATE TABLE test(a text, b text);
INSERT INTO test -- quick fake of matching rows
SELECT chr((g/1000 +32)) || to_char(g%1000, 'FM000')
, repeat (chr(g%120 + 32), 64)
FROM generate_series(1,50000) g;
SELECT pg_size_pretty(pg_relation_size('test')); -- 5640 kB
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 5648 kB
主キーを追加した後:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
したがって、最大で約 44k になると思います 36kのない行とその周辺 主キーのある行。