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

Langage SQL Discussion :

Optimiser requête utilisant NOT IN


Sujet :

Langage SQL

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut Optimiser requête utilisant NOT IN
    Bonjour à tous,

    je souhaite optimiser cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [T-Processus].[Code Produit], [T-Processus].[Indice]
    FROM [T-Processus] INNER JOIN [T-Produits] ON [T-Produits].[Code Produit]=[T-Processus].[Code Produit]
    WHERE [T-Processus].[Indice]=7 AND [T-Processus].[Code Produit] NOT IN (
    SELECT [T-Rejets].[Code Produit]
    FROM [T-Rejets]
    WHERE [T-Rejets].[Indice]=7);
    Elle est en effet destinée à être appelée souvent et si je me souviens bien le NOT IN n'est pas du meilleur effet sur les performances. Mais je ne vois pas trop comment faire, j'avais fait une tentative en utilisant des RIGHT JOIN (OUTER JOIN) mais Access (2002) n'avait pas apprécié.

    Merci d'avance pour votre aide.
    Neilos

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    D'après cet article sur les sous-requêtes, il se pourrait que la clause EXISTS comparée à la clause IN accélère tes traitements donc je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT [T-Processus].[Code Produit], [T-Processus].[Indice] 
    FROM [T-Processus] INNER JOIN [T-Produits] ON [T-Produits].[Code Produit]=[T-Processus].[Code Produit] 
    WHERE [T-Processus].[Indice]=7
    AND [T-Processus].[Code Produit] NOT EXISTS ( 
      SELECT '+' 
      FROM [T-Rejets] 
      WHERE [T-Rejets].[Indice]=7);
    Tu peux mesurer le temps d'exécution et me dire si la différence est significative ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Bonjour,
    Essayez ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.[Code Produit], p.[Indice]
      FROM [T-Processus] p
          INNER JOIN [T-Produits] pr ON ( pr.[Code Produit]=p.[Code Produit] )
          LEFT JOIN [T-Rejets] r ON ( r.[Indice] = 7 and
                                      p.[Code Produit] = r.[Code Produit] )
      WHERE p.[Indice]=7 and
            r.[Code Produit] is null

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Youssef > merci mais Access n'a pas l'air d'aimer le mariage INNER JOIN LEFT/RIGHT JOIN. Il m'envoie donc toujours balader.

    Je vais donc comparer les temps entre le EXISTS et le NOT IN.

    Petite question : que signifie
    ?

    Merci encore.


    EDIT : apparement Access ne connaît pas non plus le EXISTS. Je vais donc me cantoner à mon IN.
    Merci pour votre aide.
    Neilos

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    En lisant un article de SQLpro sur les sous-requêtes, je me suis rendu compte que : dans une sous-requête n'est pas le plus approprié => à remplacer par du : "car dans ce cas particulier, le moteur SQL choisit une constante la plus adaptée à un traitement performant".
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Merci !
    Neilos

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

Discussions similaires

  1. Optimisation requête jointure NOT IN
    Par pop_up dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 05/11/2014, 17h41
  2. Optimisation de requête decode not in decode
    Par Kiroukool dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/09/2007, 12h10
  3. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 11h18

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