PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/06/2011 13:09:39

yoyostras
Membre

Fichiers temporaires pgsql_tmp

Bonjour,
je gère une base volumineuse (300 Go) pour laquelle j'ai eu une requête assez importante avec tri par ORDER BY, requête qui m'a fait planter le SGBD après avoir saturé l'espace disque où est situé le répertoire pgsql_tmp.

Effectivement plusieurs dizaines de Go ont été écrits sous ce répertoire jusqu'à saturation. Lorsque j'ai relancé la base, tout a été effacé et c'est reparti. Mais la requête a été relancée plus tard et même souci.

Question : comment gérer au mieux pour que cela ne se reproduise plus?
Pour information, la variable work_mem est à 50 Mo, mais je ne compte pas l'augmenter.
Sur quoi peut-on jouer pour éviter ces désagréments?

Merci d'avance
Y.

Hors ligne

#2 10/06/2011 14:01:10

Marc Cousin
Membre

Re : Fichiers temporaires pgsql_tmp

Si vous avez besoin d'autant d'espace de tri, c'est soit que c'est réellement nécessaire (un tri vraiment énorme), soit que vous avez un produit cartésien ou quelque chose de ce genre dans la requête. Vérifiez déjà ce point.

Si vous avez réellement besoin de cet espace, vous pouvez créer un nouveau tablespace, et le déclarer comme tablespace temporaire (paramètre temp_tablespaces dans postgresql.conf). En le mettant dans un système de fichiers dédiés, ça vous évitera déjà que ça fasse potentiellement planter la base. Et ça vous permettra d'allouer un espace temporaire d'une taille suffisante.


Marc.

Hors ligne

#3 10/06/2011 14:16:56

gleu
Administrateur

Re : Fichiers temporaires pgsql_tmp

Une requête qui fait un tri qui génère plusieurs Go de données temporaires ? peu importe si vous comptez augmenter work_mem ou pas, il faudrait tellement de mémoire que ce n'est pas pensable. Sans parler du temps d'exécution de la requête... Bref, je pencherai plutôt pour un produit cartésien dans la requête.


Guillaume.

Hors ligne

#4 14/06/2011 08:33:40

yoyostras
Membre

Re : Fichiers temporaires pgsql_tmp

Effectivement, je confirme qu'il y avait bien un produit cartésien (requête sur 4 fois la même table) suivi d'un ORDER BY ; je vais donc faire un système de fichiers dédié ; ceci dit, je ne peux pas empêcher certains utilisateurs de faire ce genre de requête...
Que va-t-il se passer lorsque ce système de fichiers dédié sera saturé?

Merci

Hors ligne

#5 14/06/2011 08:36:34

Marc Cousin
Membre

Re : Fichiers temporaires pgsql_tmp

Les requêtes qui voudront y allouer davantage de place seront annulées.

Si vous n'avez pas confiance en vos utilisateurs, qui peuvent lancer n'importe quelle requête, vous pouvez toujours positionner un statement_timeout à une valeur raisonnable, afin d'arrêter les requêtes anormalement longues.


Marc.

Hors ligne

#6 14/06/2011 09:13:29

yoyostras
Membre

Re : Fichiers temporaires pgsql_tmp

Si je configure statement_timeout dans postgresql.conf, cela va affecter toutes les sessions ; d'ailleurs il est déconseillé de le faire dans la doc Postgresql en ligne.
Est-ce que je peux créer un trigger sur ouverture de session afin de configurer cette variable pour un seul utilisateur ?

Hors ligne

#7 14/06/2011 10:04:30

gleu
Administrateur

Re : Fichiers temporaires pgsql_tmp

Non, les triggers ne sont définissables que sur les instructions de données (INSERT, UPDATE, DELETE, COPY et TRUNCATE).


Guillaume.

Hors ligne

#8 14/06/2011 10:14:18

Marc Cousin
Membre

Re : Fichiers temporaires pgsql_tmp

Mais il suffit de faire :
ALTER USER TOTO set statement_timeout TO xxxx;


Marc.

Hors ligne

#9 17/06/2011 14:49:55

SQLpro
Membre

Re : Fichiers temporaires pgsql_tmp

yoyostras a écrit :

Effectivement, je confirme qu'il y avait bien un produit cartésien (requête sur 4 fois la même table) suivi d'un ORDER BY ; je vais donc faire un système de fichiers dédié ; ceci dit, je ne peux pas empêcher certains utilisateurs de faire ce genre de requête...i

Si en leur imposant de faire des jointures avec des JOIN et non dans la clause WHERE... Cela empêche ce type d'erreur est cette syntaxe est la norme depuis la version 1992, soit 19 ans !!!
A lire : http://sqlpro.developpez.com/cours/sqla … res/#LII-B
Je m'étonne encore qu'il y ai des développeurs faisant leur jointures dans la clause WHERE !
Quel manque de formation....

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#10 17/06/2011 16:07:38

gleu
Administrateur

Re : Fichiers temporaires pgsql_tmp

Moi  je oréfère le faire dans la clause WHERE. Chacun ses goûts.


Guillaume.

Hors ligne

Pied de page des forums