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

#1 31/08/2015 14:06:51

pitpoule
Membre

Valeur work_mem et tables temporaires sur disque

Bonjour,

J'ai un work_mem fixé à 20MB et pourtant je vois la création de table temporaire sur disque de moins de 20M (la plupart font moins de 10M). Je pensais que le paramètre work_mem permettait de fixer la taille max des tables en mémoire, j'ai loupé quelque chose ?

Merci

Hors ligne

#2 31/08/2015 17:28:48

ruizsebastien
Membre

Re : Valeur work_mem et tables temporaires sur disque

Bonjour,

Les données en mémoire vont dans la shared-memory.
Pour les tables temporaire c'est le temp_buffers.
La work_mem n'est utilisée que pour les tris des requêtes SQL.
http://docs.postgresql.fr/9.4/runtime-c … e-work-mem
Donc au dela de la valeur de work_mem les données de tri sont générées dans des fichiers temporaires sur disque.

Cordialement.

Dernière modification par ruizsebastien (31/08/2015 17:31:56)


Cordialement,

Sébastien.

Hors ligne

#3 31/08/2015 18:04:50

gleu
Administrateur

Re : Valeur work_mem et tables temporaires sur disque

Autre information : la taille sur disque des fichiers temporaires n'a rien à voir avec la taille en mémoire. L'algorithme n'est pas le même. Généralement, ça prend plus de place en mémoire que sur disque.


Guillaume.

Hors ligne

#4 01/09/2015 10:29:03

pitpoule
Membre

Re : Valeur work_mem et tables temporaires sur disque

gleu a écrit :

Autre information : la taille sur disque des fichiers temporaires n'a rien à voir avec la taille en mémoire. L'algorithme n'est pas le même. Généralement, ça prend plus de place en mémoire que sur disque.

C'est pour cela que malgré un temp_buffers à 16Mb, je vois des tables temporaires sur disque de 4MB ?

Hors ligne

#5 01/09/2015 23:10:18

gleu
Administrateur

Re : Valeur work_mem et tables temporaires sur disque

Vous parlez de work_mem, puis de temp_buffers. Ça sent la confusion.

Le work_mem, c'est pour les tris et le hachage (ORDER BY, GROUP BY, DISTINCT, jointures...). Le temp_buffers, c'est pour les tables et index temporaires (CREATE TEMP TABLE, et index associés).

Donc vous parlez de quoi ?


Guillaume.

Hors ligne

#6 02/09/2015 11:26:02

pitpoule
Membre

Re : Valeur work_mem et tables temporaires sur disque

gleu a écrit :

Vous parlez de work_mem, puis de temp_buffers. Ça sent la confusion.

Le work_mem, c'est pour les tris et le hachage (ORDER BY, GROUP BY, DISTINCT, jointures...). Le temp_buffers, c'est pour les tables et index temporaires (CREATE TEMP TABLE, et index associés).

Donc vous parlez de quoi ?

Oui je suis confu.. c'est bien le problème :s

Je vais essayer d'être plus clair. Sur mon application, je vois dans le log à intervalle régulier une même connexion qui lance une série de requêtes (un select avec 2 jointures) générant chacun un fichier temporaire ( une dizaine en tout qui font 3M et 10M). J'aurais aimé limité cette génération du fichier temporaire. Au départ, je suis parti sur work_mem (à cause des jointures) mais ça n'a rien changé. Ensuite je me suis penché sur le temp_buffers. j'ai passé le temp_buffers à 64M pensant que cela améliorerait la situation... sans succès (j'ai toujours le même phénomène avec le même nombre de fichiers générés). J'hésite à augmenter franchement ce paramètre de peur de mettre à mal la RAM (si j'ai bien compris, je peux potentiellement monter la mémoire nécessaire à temp_buffers x max_connection).

Je pense que je ne dois pas bien comprendre comment sont gérés les fichiers temporaires...


J'espère avoir été plus clair

Hors ligne

#7 02/09/2015 11:52:20

ruizsebastien
Membre

Re : Valeur work_mem et tables temporaires sur disque

Oubliez le temp_buffers et concentrez vous sur work_mem.
Il faut que vous analysiez la quantité totale de données manipulée par vos requêtes au sein de la même session et augmenter work_mem en conséquence.
Attention quand même à avoir assez de RAM sur votre serveur sinon le risque est de swapper ce qui n'est pas bon pour les perfs.
Vous pouvez mettre une valeur pour work_mem juste pour votre session (alter session set work_mem=1G par exemple).

Dernière modification par ruizsebastien (02/09/2015 11:53:02)


Cordialement,

Sébastien.

Hors ligne

#8 03/09/2015 08:28:31

pitpoule
Membre

Re : Valeur work_mem et tables temporaires sur disque

ruizsebastien a écrit :

Oubliez le temp_buffers et concentrez vous sur work_mem.
Il faut que vous analysiez la quantité totale de données manipulée par vos requêtes au sein de la même session et augmenter work_mem en conséquence.
Attention quand même à avoir assez de RAM sur votre serveur sinon le risque est de swapper ce qui n'est pas bon pour les perfs.
Vous pouvez mettre une valeur pour work_mem juste pour votre session (alter session set work_mem=1G par exemple).

En effet, j'ai augmenté plus franchement le work_mem et je ne vois plus de création de fichiers temporaires, c'était donc bien ce paramètre sur lequel je devais jouer. Merci !

Hors ligne

Pied de page des forums