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 1Maggiori 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.