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 requête jointure NOT IN


Sujet :

PostgreSQL

  1. #1
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut Optimisation requête jointure NOT IN
    Bonjour,

    J'ai actuellement une requête avec 5 jointures, dont une qui pose des problèmes de performance. La voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SELECT DISTINCT
    commande.montant, 
    commande.objet as objet, 
    commande2.commande_num as numCommandeSpeciale
     
    FROM  ref.commande as commande
     
     
    LEFT OUTER JOIN  ref.commande as commande2 ON commande.commande_num = commande2.commande_num 
    AND commande.colonne1 ='O'
    AND commande.statut IN ('XXX', 'YYY', 'ZZZ')
    AND commande2.commande_num NOT IN (SELECT DISTINCT commande_num FROM ref.table2 WHERE colonne1 IS NOT NULL)
     
     
    WHERE commande.client = '000001'
    Comment puis-je améliorer cela d'un point de vue performances sachant qu'il y a déjà les index adéquats.

    Merci pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Indiquez le plan d’exécution réel de la requête.


    Sinon je pense que vous réalisez une jointure en trop.

    Un left join sur votre table de ref devrait suffire je pense, ensuite traiter la clause select avec un case / when

  3. #3
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    le plan d'exécution ?

    cela ? :
    Nom : Sans titre.jpg
Affichages : 277
Taille : 22,5 Ko

    Je ne vois pas comment faire un left join tout simple à la place, car je souhaite conserver les enregistrements qui ne respectent pas la condition.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Sous pgadmin,

    Faites un : explain analyze .....
    ... = la requete sql

    Ensuite lancez-là et vous aurez le plan d'exécution en texte + les temps d'éxecution de la requête.


    Bref sinon je viens de tester un peu, le left outer join + le test not in transforment la jointure en jointure interne.


    du coup =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select distinct commande.montant, 
    commande.objet as objet, 
    commande.commande_num as numCommandeSpeciale 
    FROM  ref.commande as commande  
    AND commande.colonne1 ='O'
    AND commande.statut IN ('XXX', 'YYY', 'ZZZ')
    and not exists (select null from ref.table2 as B where b.colonne1 is not null and b.commande_num = commande.commande_num)
    À noter que le 1er distinct est peut-être inutile.


    Sous PostgreSQL il vaut mieux utiliser un not exists qu'un not in quand il y a une sous-requete.

    Il peut alors utiliser des anti-join qui sont généralement plus rapides (voire beaucoup plus rapides selon le cas).

  5. #5
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    merci, je vais tester ça.

Discussions similaires

  1. Optimisation requête à jointure + pb Key Efficiency
    Par Larson dans le forum Administration
    Réponses: 1
    Dernier message: 22/11/2011, 16h48
  2. optimisation requête [jointure]
    Par apidou dans le forum Requêtes
    Réponses: 9
    Dernier message: 07/07/2010, 11h51
  3. Optimisation requête jointure "conditionnelle"
    Par BaBeuH dans le forum Adaptive Server Enterprise
    Réponses: 0
    Dernier message: 02/06/2010, 17h53
  4. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  5. Optimiser les jointures dans des requêtes
    Par klereth dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 23/04/2005, 17h29

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