PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.1 » Annexes » Limites PostgreSQL

Annexe K. Limites PostgreSQL

Tableau K.1 décrit les diverses limites dures de PostgreSQL. Cependant, les limites physiques telles que les limitations de performance ou l'espace disque disponible peuvent s'appliquer avant que des limites dures absolues soient atteintes.

Tableau K.1. Limitations de PostgreSQL

ÉlémentLimite supérieureCommentaire
taille de la base de donnéesillimitée 
nombre de bases de données4 294 950 911 
relations par base de données1 431 650 303 
taille d'une relation32 ToAvec un BLCKSZ par défaut de 8192 octets
lignes par tablelimité par le nombre de lignes qui peuvent être contenus dans 4 294 967 295 blocs 
colonnes par table1600aussi limité par la taille des lignes contenues dans un simple bloc ; voir la note ci dessous
colonnes par ensemble de résultat1664 
colonnes par ensemble de résultats1664 
taille d'un champs1 Go 
index par tableillimitéelimité par le nombre maximum de relations par base de données
colonnes par index32peut être augmenté en recompilant PostgreSQL
clés de partition32peut être augmenté en recompilant PostgreSQL
longueur de l'identifiant63 octetspeut être augmenté en recompilant PostgreSQL
arguments de fonction100peut être augmenté en recompilant PostgreSQL
paramètres de requête65 535 

Le nombre maximum de colonnes pour une table est d'autant plus réduit que la ligne stockée doit être contenu dans un simple bloc de 8192 octets. Par exemple, sans compter l'entête d'une ligne, une ligne constituée de 1600 colonnes de type int consommera 6400 octets et peut être stocké dans un bloc, mais une ligne constituée de 1600 colonnes de type bigint consommera 12800 octets et ne pourra pas tenir dans le bloc. Les champs typés text, varchar et char de longueur variable peuvent avoir leurs valeurs stockées à l'extérieur dans une table TOAST lorsque cette valeur est suffisamment importante pour que cela se produise. Un pointeur de 18 octets doit rester à l'intérieur de la ligne dans la table. Pour des longueurs moins importantes de champs à longueur variable, un champ entête de 4-octets ou 1-octet est utilisé et la valeur est stockée à l'intérieur de la ligne.

Les colonnes qui ont été supprimées de la table participent aussi à la limite maximum de colonnes. De plus, bien que les valeurs des colonnes supprimées pour les nouvelles lignes créées soient marquées en interne comme null, ainsi que dans le champ de bits des valeurs null de la ligne, ce champ consomme de l'espace.

Chaque table peut enregistrer un maximum théorique de 2^32 valeurs hors ligne ;; voir Section 65.2 pour une discussion détaillée sur le stockage hors ligne. Cette limite vient de l'utilisation d'un OID 32 bits pour identifier chacune de ces valeurs. La limite pratique est significativement inférieure à la limite théorique parce que comme l'espace d'OID se remplit, trouver un OID toujours libre devient coûteux, ce qui ralentit les instructions INSERT/UPDATE. C'est uniquement un problème pour les tables contenant plusieurs téra-octets de données ; le partitionnement est un contournement possible.

Chaque table peut enregistrer un maximum théorique de 2^32 valeurs hors ligne ; voir Section 65.2 pour une discussion détaillée du stockahe hors ligne. Cette limitevient de l'utilisation d'un OID sur 32 bits pour identifier chaque valeur. La limite pratique est significativement moindre que la limite théorique parce qu'au fur et à mesure que l'espace OID se remplit, trouver nu OID toujours libre devient coûteux, ralentissant de ce fait les instructions INSERT/UPDATE. Typiquement, c'est seulement un problème pour les tables contenant plusieurs téra-octets de données ; partitionner est un contournement possible.