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 :

Optimisation de requêtes SQL - utilisation de IN SELECT


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Par défaut Optimisation de requêtes SQL - utilisation de IN SELECT
    Bonjour,

    Je souhaiterais avoir des avis éclairés sur l'optimisation de requêtes car depuis peu j'essai de de comprendre le plan d'exécution fourni dans l'analyseur de requête de SQL Server.

    Voici un cas d'école proposant deux requêtes différentes pour le même résultat :

    1)
    select * from T1
    where T1.codeT2 not in (select codeT2 from T2)

    2)
    select * from T1
    left join T2
    on T2.codeT2 = T1.codeT2
    where T2.codeT2 is null

    Je serais tenté de croire que la seconde est plus efficace, mais en analysant le plan d'exécution je commence à douter.

    Plan d'exécution :
    1)
    Coût d'exécution de la requête en fonction du lot (50%)
    SELECT (coût 100%) <-- Nested Loops/Left Anti Semi Join (Coût 0%)
    <-- Clustered Index Scan (Coût 75%)
    <-- Index Seek (Coût 200%)

    2)
    Coût d'exécution de la requête en fonction du lot (50%)
    SELECT (coût 0%) <-- Filter (Coût 0%) <-- Bookmark Lookup (Coût 100%)
    <-- Nested Loops /Left Outer Join (Coût 0%)
    <-- Clustered Index Scan (Coût 75%)
    <-- Index Seek (Coût 200%)


    Dans certain cas (on fonction des données), la première requête semble même plus rapide (le coût d'exécution de la requête en fonction du lot passe à 33% / 67% en faveur de la première --> avec le In Select).

    Suite à ce constat j'ai donc deux questions "existencielles" à poser :
    - tout ce qu'on m'a dit jusqu'à aujourd'hui comme quoi le "IN SELECT" serait à proscrire autant que possible est faux ?
    - comment dois-je comprendre le plan d'exécution (à quoi correspondent les pourcentages, la taille des flèches, etc...) ? - connaissez-vous un ou plusieurs sites expliquant comment l'analyser ?

  2. #2
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Bonjour,

    As tu fait des tests avec (si ton SGBD le supporte)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ..... WHERE NOT EXISTS (SELECT .....

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Par défaut IN - Exists - Any - Left Join --> plan d'exécution
    Je ne connais pas trop la différence entre le IN et les deux autres mots clés Exists et Any.

    Les trois requêtes suivantes affichent exactement le même plan d'exécution :

    select * from factur
    where factur.sy_fac not in (select sy_fac from boncde)

    select * from factur
    where not factur.sy_fac = any (select sy_fac from boncde)

    select * from factur
    where not exists
    (select boncde.sy_fac from boncde
    where boncde.sy_fac = factur.sy_fac)

  4. #4
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Le (NOT) EXISTS est réputé être beaucoup plus performant que le (NOT) IN, cf cet article : Optimisez votre SGBDR et vos requêtes SQL
    et en particulier 8. Optimiseurs et plan de requêtes et 9. Transformations usuelles
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

Discussions similaires

  1. optimisation de requête sql avec select imbriquées
    Par yassine_le_boss dans le forum SQL
    Réponses: 6
    Dernier message: 02/11/2010, 22h12
  2. [VBA et SQL] Requête SQL utilisant une variable VBA
    Par Altrensa dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 06/07/2007, 10h23
  3. [SQL] Problème de requête sql utilisant LIKE
    Par yakup.67 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 13h31
  4. Réponses: 2
    Dernier message: 10/04/2007, 11h46
  5. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55

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