sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur många poster kan jag lagra i 5 MB PostgreSQL på Heroku?

Diskutrymme upptaget

Att beräkna utrymmet på disken är inte trivialt. Du måste ta hänsyn till:

  • Overhead per tabell (små, i princip poster i systemkatalogen, kanske inte påverkar dig på Heroku).

  • overheaden per rad (HeapTupleHeader) och per datasida (PageHeaderData). Detaljer om sidlayout i manualen.

  • Utrymme förlorat till datatypjustering .

  • Utrymme för en NULL-bitmapp . Effektivt gratis för tabeller med 8 kolumner eller mindre, irrelevant för ditt fall.

  • Döda rader efter UPDATE / DELETE .

  • Storlek på index(en) . Du kommer att ha en primärnyckel, eller hur? Indexstorleken liknar den för en tabell med bara de indexerade kolumnerna och mindre omkostnader.

  • Det faktiska utrymmesbehovet för data, beroende på respektive datatyper . Detaljer för teckentyper (inkl. typer av fast längd) i manualen:

    Lagringskravet för en kort sträng (upp till 126 byte) är 1 byte plus den faktiska strängen, som inkluderar mellanslagsutfyllnad i fallet med character . Längre strängar har 4 byte av overhead istället för 1

    Mer information för alla typer i systemkatalogen pg_type .

  • Databasens kodning särskilt för karaktärstyper. UTF-8 använder upp till fyra byte för att lagra ett tecken (men 7-bitars ASCII-tecken upptar alltid bara en byte, även i UTF-8.)

  • Andra små saker som kan påverka ditt fall, som TOAST - vilket inte bör påverka dig med 64 teckensträngar.

Räkna med testfall

En enkel metod för att hitta en uppskattning är att skapa en testtabell, fylla den med dummydata och mäta med databasobjektstorleksfunktioner::

SELECT pg_size_pretty(pg_relation_size('tbl'));

Inklusive index:

SELECT pg_size_pretty(pg_total_relation_size('tbl'));

Ett snabbt test visar följande resultat:

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 att ha lagt till en primärnyckel:

ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);

SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB

Så jag förväntar mig maximalt runt 44k rader utan och runt 36k rader med primärnyckel.




  1. MySQL COUNT() – Få antalet rader som ska returneras av en fråga

  2. 4 sätt att förhindra varningsöverbelastning med SQL Server-övervakning

  3. Gå med i Q&A Forum för utvecklare

  4. Fördelarna med PostgreSQL