Schijfruimte bezet
Het berekenen van de ruimte op de schijf is niet triviaal. Je moet rekening houden met:
-
De overhead per tafel (klein, in feite de vermeldingen in de systeemcatalogus, heeft mogelijk geen invloed op u op Heroku).
-
De overhead per rij (HeapTupleHeader) en per gegevenspagina (PageHeaderData). Details over pagina-indeling in de handleiding.
-
Ruimte verloren door uitlijning van gegevenstype .
-
Ruimte voor een NULL-bitmap . Effectief gratis voor tabellen van 8 kolommen of minder, niet relevant voor uw geval.
-
Dode rijen na
UPDATE
/DELETE
. -
Grootte van index(en) . Je hebt toch een primaire sleutel? De indexgrootte is vergelijkbaar met die van een tabel met alleen de geïndexeerde kolommen en minder overhead.
-
De werkelijke ruimtebehoefte van de gegevens, afhankelijk van de respectievelijke gegevenstypen . Details voor karaktertypes (incl. types met vaste lengte) in de handleiding:
De opslagvereiste voor een korte string (tot 126 bytes) is 1 byte plus de eigenlijke string, inclusief de spatie in het geval van
character
. Langere strings hebben 4 bytes overhead in plaats van 1Meer details voor alle typen in de systeemcatalogus
pg_type
. -
De database codering in het bijzonder voor karaktertypes. UTF-8 gebruikt maximaal vier bytes om één teken op te slaan (maar 7-bit-ASCII-tekens nemen altijd slechts één byte in beslag, zelfs in UTF-8.)
-
Andere kleine dingen die van invloed kunnen zijn op uw zaak, zoals TOAST - wat u niet zou moeten beïnvloeden met reeksen van 64 tekens.
Berekenen met testcase
Een eenvoudige methode om een schatting te vinden, is door een testtabel te maken, deze te vullen met dummygegevens en te meten met functies voor de grootte van databaseobjecten::
SELECT pg_size_pretty(pg_relation_size('tbl'));
Inclusief indexen:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
Een snelle test toont de volgende resultaten:
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
Na het toevoegen van een primaire sleutel:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
Dus ik verwacht een maximum van ongeveer 44k rijen zonder en rond 36k rijen met primaire sleutel.