Diskplads optaget
Det er ikke trivielt at beregne pladsen på disken. Du skal tage højde for:
-
Overhead pr. tabel (små, dybest set posterne i systemkataloget, påvirker muligvis ikke dig på Heroku).
-
overhead pr. række (HeapTupleHeader) og pr. dataside (PageHeaderData). Detaljer om sidelayout i manualen.
-
Plads tabt til datatypejustering .
-
Plads til en NULL bitmap . Effektivt gratis for tabeller med 8 kolonner eller mindre, irrelevant for din sag.
-
Døde rækker efter
UPDATE
/DELETE
. -
Størrelse på indeks(er) . Du har en primær nøgle, ikke? Indeksstørrelsen svarer til den for en tabel med kun de indekserede kolonner og mindre overhead.
-
Det faktiske pladsbehov for dataene, afhængigt af de respektive datatyper . Detaljer for tegntyper (inkl. faste længdetyper) i manualen:
Lagerkravet for en kort streng (op til 126 bytes) er 1 byte plus den faktiske streng, som inkluderer mellemrumsudfyldningen i tilfælde af
character
. Længere strenge har 4 bytes overhead i stedet for 1Flere detaljer for alle typer i systemkataloget
pg_type
. -
Databasens kodning især for karaktertyper. UTF-8 bruger op til fire bytes til at gemme ét tegn (Men 7-bit-ASCII-tegn optager altid kun én byte, selv i UTF-8.)
-
Andre små ting, der kan påvirke din sag, såsom TOAST - hvilket ikke bør påvirke dig med 64 tegnstrenge.
Beregn med testcase
En simpel metode til at finde et estimat er at oprette en testtabel, udfylde den med dummy-data og måle med databaseobjektstørrelsesfunktioner::
SELECT pg_size_pretty(pg_relation_size('tbl'));
Inklusive indekser:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
En hurtig test viser følgende resultater:
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
Efter tilføjelse af en primær nøgle:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
Så jeg forventer et maksimum på omkring 44k rækker uden og omkring 36k rækker med primærnøgle.