Espace disque occupé
Le calcul de l'espace sur disque n'est pas anodin. Vous devez prendre en compte :
-
La surcharge par table (petite, essentiellement les entrées du catalogue système, peut ne pas vous affecter sur Heroku).
-
Les frais généraux par ligne (HeapTupleHeader) et par page de données (PageHeaderData). Détails sur la mise en page dans le manuel.
-
Espace perdu à cause de l'alignement des types de données .
-
Espace pour un bitmap NULL . Effectivement gratuit pour les tableaux de 8 colonnes ou moins, sans rapport avec votre cas.
-
Lignes mortes après
UPDATE
/DELETE
. -
Taille des index(s) . Vous aurez une clé primaire, non ? La taille de l'index est similaire à celle d'une table avec uniquement les colonnes indexées et moins de surcharge.
-
L'espace réel requis pour les données, en fonction des types de données respectifs . Détails pour les types de caractères (y compris les types de longueur fixe) dans le manuel :
L'exigence de stockage pour une chaîne courte (jusqu'à 126 octets) est de 1 octet plus la chaîne réelle, ce qui inclut l'espace de remplissage dans le cas de
character
. Les chaînes plus longues ont 4 octets de surcharge au lieu de 1Plus de détails pour tous les types dans le catalogue système
pg_type
. -
L'encodage de la base de données en particulier pour les types de caractères. UTF-8 utilise jusqu'à quatre octets pour stocker un caractère (mais les caractères 7-Bit-ASCII occupent toujours un seul octet, même en UTF-8.)
-
D'autres petites choses qui peuvent affecter votre cas, comme TOAST - qui ne devrait pas vous affecter avec des chaînes de 64 caractères.
Calculer avec un cas de test
Une méthode simple pour trouver une estimation consiste à créer une table de test, à la remplir avec des données factices et à mesurer avec les fonctions de taille d'objet de la base de données : :
SELECT pg_size_pretty(pg_relation_size('tbl'));
Y compris les index :
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
Un test rapide montre les résultats suivants :
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
Après avoir ajouté une clé primaire :
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
Donc, je m'attendrais à un maximum d'environ 44k lignes sans et autour de 36k lignes avec clé primaire.