Vous n'êtes pas identifié(e).
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
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
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
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
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
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
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
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