Existe-t-il une contrainte de longueur maximale pour une requête postgres?

33

L'application que nous construisons peut exécuter de très grosses requêtes d'insertion. Y a-t-il une limite à ce que ma requête postgres ne puisse contenir qu'un certain nombre de caractères?

Kannan Ramamoorthy
la source
2
Je dirais simplement que si vous vous approchez de toute limite de cette nature, vous devrez reconsidérer votre conception. J'ai constaté que les requêtes les plus proches sont généralement générées par une sorte de cadre (impliquant une concaténation extrême de chaînes) et qu'elles ont tendance à perdre le contact avec la réalité.
Vérace

Réponses:

43

Pour la version actuelle de PostgreSQL (jusqu'à la version 9.5), les requêtes sont reçues par un serveur dans un Stringinfotampon limité à MaxAllocSize, défini comme suit:

#define MaxAllocSize   ((Size) 0x3fffffff) /* 1 gigabyte - 1 */

(voir http://doxygen.postgresql.org/memutils_8h.html )

Ainsi, une requête est limitée à 1 gigaoctet (2 ^ 30), moins un octet pour un octet nul final.

Si un client essayait d'envoyer une requête plus volumineuse, une erreur ressemblant à ceci se reproduirait:

ERREUR: mémoire
insuffisante DETAIL: impossible d'agrandir le tampon de chaîne contenant 0 octet sur plus de N octets.

Nest la taille de la requête.

Sachez qu'une requête juste en dessous 1GBpeut nécessiter d'importantes quantités de mémoire à analyser, planifier ou exécuter, en plus de ce 1GBtampon.

Si vous devez insérer une grande série de littéraux dans une requête, envisagez la possibilité de créer une table temporaire et ses COPYlignes et de faire en sorte que la requête principale fasse référence à cette table temporaire.

Daniel Vérité
la source