IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration PostgreSQL Discussion :

Problème de Performances entre bases avec une même requête


Sujet :

Administration PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Problème de Performances entre bases avec une même requête
    Bonjour,

    J'ai un gros problème de performances qui m'interpelle.

    Je dispose d'un serveur postgres sur lequel sont déployés n bases toutes construites à partir d'un même script, ayant donc la même structure, tables, index ...

    Je réalise exactement la même requête sur chaque base et j'obtiens des temps de réponse allant de 0,5 s à 45 s!

    La base la plus chargée donne le meilleur temps!

    Une instruction VACUUM FULL ANALYZE sur les bases n'y change rien.

    Si vous avez une idée de ce qui peut expliquer la chose, moi ça me laisse perplexe.
    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut comparer l'EXPLAIN ANALYZE d'une requête rapide et lente suivant la base.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bon bah,

    Les plans d'exécution ne sont pas nécessairement les mêmes entre chaque base. Le point consommateur est identifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Nested Loop (cost=491.48..73612.24 rows=106514 width=28) (actual time=26.384..10912.759 rows=17181 loops=1)
     
        * Join Filter: ((("inner".objet)::text ~~ '%test%'::text) OR ("inner".contenu ~~ '%test%'::text) OR (("outer".nom)::text ~~ '%test%'::text) OR (("outer".sousnom)::text ~~ '%test%'::text) OR (("inner".sousnom)::text
    Dans le meilleur des cas ce n'est pas une Nested Loop mais un Merge join qui réalise ce groupe de conditions alors sur beaucoup moins de lignes. Voilà pour les différences.
    Mais je n'ai pas l'explication de pourquoi de telles différences et comment les réduire ...

    Ca reste pour moi un bon schmilblic!

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Voici différentes choses faisables:
    - augmenter la précision des statistiques avec ALTER TABLE SET STATISTICS. Par défaut c'est 100 sur 8.4+ et 10 sur versions antérieures.
    - augmenter work_mem pour favoriser le choix d'un merge join. il peut être changé n'importe quand y compris juste pour une requête
    - changer les constantes de l'optimiseur comme random_page_cost ou cpu_tuple_cost
    - mettre enable_nestloop à false ce qui le forcera à choisir autre chose (méthode recommandée quand rien d'autre ne fonctionne).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    J'ai fait deux manipulations

    - augmenter work_mem pour favoriser le choix d'un merge join
    - mettre enable_nestloop à false ou off

    Résultat : aucun changement et ce qui est surprenant c'est qu'il continue à utiliser des nested loop.

    c'en est désespérant ...

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/01/2010, 12h27
  2. Réponses: 6
    Dernier message: 30/01/2009, 20h18
  3. Réponses: 1
    Dernier message: 08/05/2008, 23h00
  4. Créer par code des relations entre tables d'une même base ?
    Par AndréPe dans le forum Modélisation
    Réponses: 2
    Dernier message: 21/11/2007, 18h27
  5. Copie d'une table entre bases, avec un champs long
    Par LaVaZza dans le forum Oracle
    Réponses: 6
    Dernier message: 18/04/2006, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo