|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 6 ![]() |
Bonjour,
J'ai écrit un bout de logiciel pour insérer des lignes dans une table (j'utilise la commande "copy from stdin"). La table est définie comme ci dessous: Code :
Code :
Cependant, le disque se remplit, et régulièrement, au bout de 2 ou 3 mois, le serveur postgresql se plante car le disque est plein ! Pourquoi est-ce que le taille sur le disque augmente (alors que le nombre d'entrée dans la table n'augmente pas) ? Merci d'avance pour votre aide et vos conseils. Amicalement Thierry |
||||
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() Développeur informatique Inscription : mai 2004 Messages : 394 ![]() |
n'y a t il pas un journal de transactions (comme dans sqlserver) qui gonfle régulièrement ?
__________________
http://chat.developpez.com/ -- Salon Base de Données -- |
|
|
10
|
|
|
#3 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Le journal de transactions est recyclé automatiquement sauf si archive_mode est à on.
Il est possible que ce soit l'index ou les index qui grossissent. Tu peux faire un REINDEX TABLE dataflow après le VACUUM pour éviter ça. Sinon suivre l'évolution des tailles avec les fonctions pg_database_size(), pg_relation_size() et pg_total_relation_size() |
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 6 ![]() |
Salut,
J'ai suivi vos conseils, merci... mais j'ai un peu de mal à interpréter le résultat ! Il efface 49619262 raws... ce qui fait augmenter le pg_database_size, pg_relation_size, et pg_total_relation_size !!! Il y a un bug, ou quelqu'un peut m'expliquer ?! Merci. Amicalement T. Code :
|
||
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Il faut faire le REINDEX
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 6 ![]() |
Effectivement... (voir ci dessous)
Mais c'est pas terrible. La logique aurait voulu que ça fasse partie du VACUUM ! Et pour moi, c'est un vrai problème: pour faire un REINDEX, la table doit rester verrouillée en lecture/écriture pendant presque 1/2 heure(!!), or je dois insérer des données tous les 1/4 h... db=> select pg_database_size(16385), pg_relation_size(16394), pg_total_relation_size(16394);
pg_database_size | pg_relation_size | pg_total_relation_size
------------------+------------------+------------------------
24113665808 | 15027437568 | 23482236928
(1 row)
db=> REINDEX TABLE dataflow;
select pg_database_size(16385), pg_relation_size(16394), pg_total_relation_size(16394);
REINDEX
znets=> select pg_database_size(16385), pg_relation_size(16394), pg_total_relation_size(16394);
pg_database_size | pg_relation_size | pg_total_relation_size
------------------+------------------+------------------------
20088559376 | 15027437568 | 19457130496
(1 row) |
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Comme la clef primaire porte sur 6 champs, l'index doit être en plus assez coûteux.
Sur un problème de ce genre, personnellement j'évaluerais deux pistes: 1) partitionnement avec suppression des partitions obsolètes. Dans ce cas plus besoin ni de delete ni de vacuum ni de reindex. La difficulté est de trouver la bonne clef de partitionnement mais ton num_id_cycle a l'air d'un bon candidat. 2) si impossible de partitionner, voir s'il est possible de se passer de l'index. |
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 6 ![]() |
Merci pour ta réponse.
1) Non, un partitionnement des données n'est plus envisageable à ce stade du projet (et c'est très contraignant...) 2) Comment ? Je supprime la clé primaire de la table ? ... lors de la conception, j'ai pas imaginé une seconde que le VACUUM ne faisait pas complètement le ménage et qu'il allait falloir que je lance des REINDEX sur les index généré d'après la clé publique des tables !! Si je vire la clé primaire et que je crée quelques index, chacun sur 1 seul champ... le REINDEX sera plus rapide ? Merci. |
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Le ménage complet se fait VACUUM FULL + REINDEX mais c'est une opération très coûteuse dès qu'il y a un volume important. VACUUM seul repère simplement les trous utilisables plus tard mais ne les élimine pas sauf s'ils sont à la fin de la table.
Si la clef primaire n'est pas indispensable, alors autant la supprimer. Ensuite s'il y a d'autres index nécessaires, voir s'il peuvent être créés avec le type hash au lieu de btree (dans ce cas chaque index doit être mono-colonne). D'après la doc c'est plutôt l'index btree qui est sujet à la dilatation en taille. |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 6 ![]() |
Le concept du VACUUM est très bien et très clair...
Mais le REINDEX c'est du grand n'importe quoi ! Ca sert à quoi de gérer un index de manière transparente, s'il n'est pas mis à jour lors des DELETE ??? Encore une chance qu'il faille pas faire un REINDEX qui bloque la table 1/4h après chaque INSERT... Enfin bref, je vais essayer de bricoler un truc du coup... Merci pour ton aide |
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
J'ai déjà aussi rencontré ce genre de problème
Le hic sous Postgresql c'est que quand on fait un "create index" ou "reindex" ça locke la table Pour le partitionnement n'en parlons même pas c'est une usine à gaz avec des contraintes/triggers partout N'y a-t-il aucun créneau horaire pendant lequel la table n'est pas utilisée pour pouvoir faire cette opération ? Si non, tu peux éventuellement essayer d'augmenter le paramètre maintenance_work_mem pour accélérer le reindex ou le create index si tu le droppes à chaque fois
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#12 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
A noter que pour CREATE INDEX, il y a une option CONCURRENTLY qui fait que la table n'est pas verrouillée pendant l'opération.
|
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
D'après la documentation, il est possible de réindexer sans verrouiller les tables : http://www.postgresql.org/docs/9.0/s...X-CONCURRENTLY
Par contre ce n'est pas une option de la commande REINDEX et il faut supprimer et recréer l'index pour bénéficier de l'option. edit : Cramé de 10mn |
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Je ne connaissais pas l'option CONCURRENTLY, merci à vous deux pour l'info
Ça oblige à faire un drop/create des index et PK mais bon c'est mieux que rien ...
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 6 ![]() |
Salut,
Oui, finalement, j'ai réglé le problème en faisant des drops index et des create index concurrently. C'est plus rapide qu'un reindex, et ça évite de locker la table. Merci pour votre aide et vos conseils. Amicalement Thierry |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com