Par défaut, le client psql collecte tous les résultats d'une requête avant de fournir le résultat, pour pouvoir formater la sortie (par exemple pour calculer la largeur optimale des colonnes)

Dans le cas des requêtes très importantes, cela engendre une utilisation mémoire qui peut faire échouer la requête (le processus est tué). En ordre de grandeur, la mémoire utilisée est environ 10 fois supérieure à la taille du fichier créé.

La parade consiste à utiliser la variable FETCH_COUNT à l'appel de psql. Extrait de la documentation officielle PostgreSQL :

    If this variable is set to an integer value > 0, the results of SELECT queries are fetched and displayed in groups of that many rows, rather than the default behavior of collecting the entire result set before display. Therefore only a limited amount of memory is used, regardless of the size of the result set. Settings of 100 to 1000 are commonly used when enabling this feature. Keep in mind that when using this feature, a query might fail after having already displayed some rows.

Ainsi, l'appel de psql avec les options suivantes permet de limiter l'utilisation mémoire, quelle que soit la taille de l'échantillon requêté :

psql -h serveur.domaine -d baseDeDonnees -U user -t -A -F";" --variable="FETCH_COUNT=10000" -F script.sql 

Ajouter un Commentaire


Code de sécurité
Rafraîchir