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

PostgreSQL Discussion :

optimisation d'une requête avec jointure


Sujet :

PostgreSQL

  1. #1
    Membre habitué Avatar de champijulie
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 131
    Points
    131
    Par défaut optimisation d'une requête avec jointure
    Bonjour à tous.

    J'ai fait un explain sur une requête sous Oracle et sous Postgre (la même traduite suivant que j'utilise Oracle ou PostgreSQL) que je vous donne (version Postgre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select count(*) From 
    (
    Select D."ID_DOSSIER", "NOMDOSSIER"
    From ddc_appia."DOSSIER" D left outer join ddc_appia."DOSSIERETAT" DE on D."ID_DOSSIER" = DE."ID_DOSSIER"
    Where (DE."ID_ETAT" = 2 or DE."ID_ETAT" is null)
    ) x ;
    Et là, je constate une chose bizarre. Sous Oracle, il y a l'utilisation d'un index sur dossieretat alors qu'il n'est pas utilisé sous PostgreSQL.
    Je me suis dit que si il était utilisé sous Oracle et que les deux requêtes étaient identiques alors PostgreSQL devrait l'utiliser également. Non?

    Je ne sais pas comment le faire pour lui faire utiliser cet index. Y a t il un moyen de le forcer à l'utiliser ou de lui rappeller qu'il existe un index qu'il pourrait accessoirement utiliser?
    Merci d'avance de me répondre.
    champijulie.

  2. #2
    Membre habitué Avatar de champijulie
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 131
    Points
    131
    Par défaut
    J'ai constaté un petit truc rigolo :
    J'exécute cette requête sur trois bases différentes par la taille mais qui ont la même structure:
    pour la plus petite base : utilisation de 2 index
    pour la moyenne base : utilisation d'un seul index
    pour la grosse base : aucune utilisation d'index

    Alors que ce sont les mêmes tables avec les mêmes index et la même requête. Et là, j'avoue que je ne comprend pas.
    les index prennent en compte la taille de la table au nuveau de données ????

    Je ne sais pas quoi penser...
    champijulie

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    pour pouvoir choisir une stratégie efficace d'exécution des requêtes utilisateurs, Postgres a besoin de stats sur les tailles (nb d'enregistrements) des tables, les indexes, etc.

    Pour constituer ces stats, il faut lancer assez régulièrement la commande suivante :
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre habitué Avatar de champijulie
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 131
    Points
    131
    Par défaut
    Je viens d'en faire un mais il bloque sur une violation d'index dans la table pg_statistic du schéma pg_catalog qui est un schéma système auquel je n'ai pas touché.
    Je ne sais pas quoi faire pour remédier à cette erreur. Il me marque:
    ERROR: duplicate key violates unique constraint "pg_statistic_relid_att_index"
    J'essaie depuis tout à l'heure de voir d'où ça peut provenir. En efeet, il y a des doublons sur cette table par rapport à l'index mais je ne vois pas comment il aurait pu être inséré.

    @+
    champijulie

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Tu es sur quelle version de PostgreSQL ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Membre habitué Avatar de champijulie
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 131
    Points
    131
    Par défaut
    Version 8.0.2 pour Windows

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Curieux...
    La seule mention de ce problème que j'ai trouvée est cette URL : http://qaix.com/postgresql-database-...dex-read.shtml

    Avant de faire ce que préconise Tom Lane dans sa réponse, je te conseille quand même de faire une sauvegarde complète de tes bases (on n'est jamais trop prudent)...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  8. #8
    Membre habitué Avatar de champijulie
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 131
    Points
    131
    Par défaut
    J'ai suivi son conseil et le tien par la même occasion.
    Ca a l'air de fonctionner mais c'est vraiment radical comme solution...

    Merci beaucoup pour ton aide
    @ la prochaine
    champijulie

  9. #9
    Membre habitué Avatar de champijulie
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 131
    Points
    131
    Par défaut
    Ca c'est améliorer dans le sens où maintenant il utilise un peu plus les index mais c'est pas encore gagné car il ne les utilise pas tous et je ne sais pas comment le forcer à les utiliser...

    Merci de me répondre
    champijulie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation d'une requête avec jointure multiple
    Par lucas52 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/03/2012, 14h36
  2. Aide sur une requête avec jointure..
    Par WeDgEMasTeR dans le forum Requêtes
    Réponses: 7
    Dernier message: 10/11/2009, 18h09
  3. Réponses: 11
    Dernier message: 15/09/2008, 10h25
  4. Lenteur sur une requête avec jointure
    Par mister3957 dans le forum SQL
    Réponses: 16
    Dernier message: 13/08/2008, 13h10
  5. [ABAP] Comment créer une requête avec jointure
    Par roadster62 dans le forum SAP
    Réponses: 1
    Dernier message: 21/02/2006, 16h04

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