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?
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?
Réponses:
Pour la version actuelle de PostgreSQL (jusqu'à la version 9.5), les requêtes sont reçues par un serveur dans un Stringinfo
tampon 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.
où N
est la taille de la requête.
Sachez qu'une requête juste en dessous 1GB
peut nécessiter d'importantes quantités de mémoire à analyser, planifier ou exécuter, en plus de ce 1GB
tampon.
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 COPY
lignes et de faire en sorte que la requête principale fasse référence à cette table temporaire.