PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Combien d'enregistrements puis-je stocker dans 5 Mo de PostgreSQL sur Heroku ?

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 1

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