optimisation de l'efficacité du vacuum

mercredi 11 mars 2015

Bonjour,

Je cherche à savoir s'il est possible d'optimiser la taille d'une table sans avoir à exécuter un vacuum full (la table doit restée disponible pour l'utilisateur).

Mes tables ressemblent à ceci:




CREATE TABLE event (
id integer NOT NULL,
"time" timestamp(6) without time zone DEFAULT now() NOT NULL,
info text NOT NULL
);
CREATE TABLE object (
id integer NOT NULL,
name text DEFAULT ''::text NOT NULL
);
CREATE TABLE object_data (
object_id integer NOT NULL,
event_id integer NOT NULL,
field1 double precision NOT NULL,
field2 double precision NOT NULL,
field3 double precision NOT NULL,
field4 double precision NOT NULL,
field5 double precision NOT NULL,
field6 double precision NOT NULL
);


Fréquemment, dans une application c++, je parcours l'ensemble des event pour mettre à jour les données de chaque object dans la table object_data (implémenté à l'aide d'un "delete where event_id=?" puis d'un "copy de l'ensemble des object pour l'event concerné").

Après 5 à 6 boucles, la taille de la table a augmenté significativement et le vacuum n'a presque aucun effet.


Par exemple, pour un nombre d'entrées d'1 million (1000 events et 1000 objects), la taille de ma table object_data évolue de la façon suivante:

boucle 1: taille=81Mo

boucle 2: taille=161Mo

boucle 3: taille=242Mo

boucle 4: taille=261Mo

boucle 5: taille=322Mo

boucle 6: taille=322Mo

boucle 7: taille=322Mo


Suite à ce test, le vacuum était ensuite sans effet.

Ce comportement vous parait-il normal? est-il évitable?

Est ce qu'une modification du fillfactor peut avoir un effet bénéfique?

Vaut-il mieux laisser l'auto vacuum actif sur cette table ou bien est-il préférable de le désactiver le temps de la mise à jour de la table?

D'autres idées?


Merci d'avance





0 commentaires:

Enregistrer un commentaire

 

Lorem

Ipsum

Dolor