Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Administration
Administration Forum d'entraide sur l'administration de PostgreSQL : utilisateurs, privilèges, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2011, 12h48   #1
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Par défaut [postgreSql 9.0.4] degradation performance update

Bonjour
Je suis à la recherche de pistes d'optimisation serveur pour le cas suivant:

Update en boucle "par colonne" de table ayant 70 colonnes et 700 000 enregistrements.
Scénario:
La table cible est tronquée, puis initialisation (insert) de l'identifiant de "PK". Ensuite le reste de colonnes est traité en boucle.

Le traitement de chaque colonne consiste à :
  • récupérer sa valeur dans une table source
  • effectuer une série de tests/transformations
  • transférer la valeur finale dans la colonne correspondante de table cible
Problème : le temps du traitement de chaque colonne s'allonge au fur et mesure d'avancement (x 10 à la fin).
Ceci doit s'expliquer par le réarrangement des données dans la page suite au rallongement des enregistrements.

Serait-il possible de mieux gérer ce stockage initial, via quel paramètre ?

Merci d'avance
msomso

P.S.
En PJ le fichier log du traitement en cours
Fichiers attachés
Type de fichier : zip Copie de postgresql-2011-05-04_111536.zip (25,2 Ko, 4 affichages)
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h46   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Citation:
Envoyé par msomso Voir le message
Problème : le temps du traitement de chaque colonne s'allonge au fur et mesure d'avancement (x 10 à la fin).
Ceci doit s'expliquer par le réarrangement des données dans la page suite au rallongement des enregistrements.
S'il s'agit de ça, le paramètre qui peut aider est le FILLFACTOR de la table et des index associés.
Ceci étant la mise à jour multiple d'une même ligne colonne par colonne est une stratégie pas du tout optimale. Le mieux serait de changer l'algorithme pour grouper les colonnes dans le même ordre UPDATE.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 10h38   #3
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bjr
Merci bien c'est exactement ce que je voudrais tester.
Sauriez-vous, comment identifier les enregistrements chainés ?

msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 11h49   #4
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Il n'y a pas à ma connaissance d'enregistrements chainés. Je sais que ça existe dans d'autres SGBD comme Oracle mais pas postgres, qui utilise un autre mécanisme qui s'appelle TOAST pour les champs qui prennent beaucoup de place.
En revanche lorsqu'une ligne est mise à jour, l'intégralité de la ligne est recopiée ailleurs pour en faire une nouvelle version. C'est le mécanisme MVCC pour permettre des lectures concurrentes de données qui n'ont pas la même valeur d'une transaction à l'autre.
Ensuite les anciennes versions des lignes sont recyclées par auto-vacuum, mais ça n'empêche pas les données utiles d'être éparpillées. C'est pourquoi mettre à jour une même ligne en plusieurs UPDATE est mauvais pour les perfs.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 10h45   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
1) dans ce genre de traitement ligne à ligne il est normale que le système ralentisse au fur et à mesure de l'avancement dans le traitement des lignes, car un SGBDR n'étant pas fait pour ce genre de traitement, vous l'utilisez à l'envers (en le dégradant sciemment).
Essayez donc de faire ces traitements de manière ensembliste en adoptant la stratégie suivante :
1.1 créer une fonction qui fait toutes les transformation de manière unitaire
1.2 encapsulez cette fonction dans l'UPDATE ensembliste

2) désactivez tous les index avant de réaliser votre traitement,sauf l'index sous-jacent à la clef primaire, puis reconstruisez les en fin de traitement.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h56.


 
 
 
 
Partenaires

Hébergement Web