14

2つのフィールドを持つ単一のテーブルにレコードを格納します。

  • id->4文字

  • password_hash->64文字

上記のようなレコードをHerokuの5MBPostgreSQLにいくつ保存できますか?

PS:x列で長さがyの単一のテーブルがある場合、データベースで必要なスペースを計算するにはどうすればよいですか?

4

1 に答える 1

32

占有ディスク容量

ディスク上のスペースを計算するのは簡単ではありません。次のことを考慮する必要があります。

  • テーブルごとのオーバーヘッド。小さく、基本的にはシステム カタログのエントリです。

  • 行ごと( ) およびデータ ページごと( )のオーバーヘッドマニュアルのページレイアウトの詳細。HeapTupleHeaderPageHeaderData

  • データ型に応じて、列の配置のためにスペースが失われます。

  • NULL ビットマップ用のスペース。あなたのケースとは関係なく、8列以下のテーブルでは事実上無料です。

  • UPDATE/の後のデッド行DELETE。(スペースが最終的にバキュームされて再利用されるまで。)

  • インデックスのサイズ。主キーがありますよね?インデックスのサイズは、インデックスが作成された列だけで行ごとのオーバーヘッドが少ないテーブルのサイズに似ています。

  • それぞれのデータ型に応じた、データの実際の容量要件。マニュアルの文字型(固定長型を含む)の詳細

    短い文字列 (最大 126 バイト) のストレージ要件は、1 バイトに実際の文字列を加えたものであり、character. より長い文字列には、1 バイトではなく 4 バイトのオーバーヘッドがあります

    システム カタログのすべてのタイプの詳細pg_type

  • 特に文字型のデータベースエンコーディング。UTF-8 は 1 文字を格納するために最大 4 バイトを使用します (ただし、7 ビット ASCII 文字は、UTF-8 であっても常に 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

したがって、主キーなしで最大約44,000行、主キーありで約36,000行になると予想されます。

于 2012-06-04T18:11:46.693 に答える