sql >> Database >  >> RDS >> PostgreSQL

Hoeveel records kan ik opslaan in 5 MB PostgreSQL op Heroku?

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 1

    Meer 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.




  1. SQL-tijdsverschil tussen twee datums resulteert in uu:mm:ss

  2. Krijg het aantal records beïnvloed door INSERT of UPDATE in PostgreSQL

  3. Hoe het verschil tussen twee datums in T-SQL te berekenen

  4. nieuwe SQL-record-ID ophalen