PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Quanti record posso archiviare in 5 MB di PostgreSQL su Heroku?

Spazio su disco occupato

Calcolare lo spazio su disco non è banale. Devi tenere in considerazione:

  • L'overhead per tabella (piccolo, in pratica le voci nel catalogo di sistema, potrebbero non influire su Heroku).

  • Il overhead per riga (HeapTupleHeader) e per pagina di dati (PageHeaderData). Dettagli sul layout di pagina nel manuale.

  • Spazio perso per l'allineamento del tipo di dati .

  • Spazio per una bitmap NULL . Effettivamente gratuito per tabelle di 8 colonne o meno, irrilevante per il tuo caso.

  • Righe morte dopo UPDATE / DELETE .

  • Dimensione di indice/i . Avrai una chiave primaria, giusto? La dimensione dell'indice è simile a quella di una tabella con solo le colonne indicizzate e un sovraccarico minore.

  • Il requisito di spazio effettivo dei dati, a seconda dei rispettivi tipi di dati . Dettagli per i tipi di carattere (inclusi i tipi a lunghezza fissa) nel manuale:

    Il requisito di archiviazione per una stringa breve (fino a 126 byte) è 1 byte più la stringa effettiva, che include il riempimento dello spazio nel caso di character . Le stringhe più lunghe hanno 4 byte di sovraccarico invece di 1

    Maggiori dettagli per tutti i tipi nel catalogo di sistema pg_type .

  • La codifica del database in particolare per i tipi di carattere. UTF-8 utilizza fino a quattro byte per memorizzare un carattere (ma i caratteri ASCII a 7 bit occupano sempre un solo byte, anche in UTF-8.)

  • Altre piccole cose che potrebbero influire sul tuo caso, come TOAST - che non dovrebbe interessarti con stringhe di 64 caratteri.

Calcola con test case

Un metodo semplice per trovare una stima è creare una tabella di test, riempirla con dati fittizi e misurare con le funzioni di dimensione dell'oggetto del database::

SELECT pg_size_pretty(pg_relation_size('tbl'));

Compresi gli indici:

SELECT pg_size_pretty(pg_total_relation_size('tbl'));

Un rapido test mostra i seguenti risultati:

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

Dopo aver aggiunto una chiave primaria:

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

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

Quindi, mi aspetto un massimo di circa 44k righe senza e intorno a 36k righe con chiave primaria.