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

MS SQL Server Discussion :

JOIN ou IF EXISTS


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut JOIN ou IF EXISTS
    Bonjour,

    ces trois requêtes me renvoyent le même résultat mais la durée d'exécution est de 22 s pour la 1°, 23 s pour la 2° et 6 s pour la 3° avec le if exists

    la différence dans le plan d'exécution est juste au niveau du SORT

    une idée du pourquoi ?

    les trois requêtes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.ID,A.CLICKS FROM PUBLISHER_TRACKING_DATA A
    JOIN ELEMEN B on B.NUMBER=A.ELEMENT_ID
    WHERE B.COSITE=86
    AND A.CURRENCY_CODE='USD'  
    group by  A.ID,A.CLICKS -- 22 s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.ID,A.CLICKS FROM PUBLISHER_TRACKING_DATA A
    JOIN ELEMEN B on B.NUMBER=A.ELEMENT_ID and B.COSITE=86
    WHERE A.CURRENCY_CODE='USD'  
    group by  A.ID,A.CLICKS  -- 23 s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.ID,A.CLICKS FROM PUBLISHER_TRACKING_DATA A
    WHERE A.CURRENCY_CODE='USD' 
    AND  EXISTS(SELECT 1 FROM ELEMEN B where B.NUMBER=A.ELEMENT_ID AND B.COSITE=86) -- 6s

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    La réponse est presque dans la question ...
    Pour les 2 premières requêtes, vous demandez au SGBD de ramener plein de lignes (à cause des jointures) alors que seule la 1ère table vous intéresse (vous dédoublez la partie utile) et finalement vous lui demandez une "agrégation" qui n'en n'est pas une. Forcément ça lui prend du temps de faire le ménage.

    Dans la 3ème, vous lui demandez de ne ramener que les lignes idoines en cas d'existence dans la table correspondante. Il ne dédouble rien, n'a pas à faire de ménage, c'est plus efficace.

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    ton explication est efficace Rei Ichido

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

Discussions similaires

  1. INNER JOIN sur un table si les données existent
    Par Anduriel dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/07/2012, 14h50
  2. LEFT OUTER JOIN ou EXISTS ?
    Par Khleo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/12/2010, 21h22
  3. LEFT JOIN ou NOT EXISTS ?
    Par popy67 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/06/2010, 16h15
  4. [HQL] Left Join fetch et exists
    Par LittleBean dans le forum Hibernate
    Réponses: 3
    Dernier message: 23/10/2009, 15h41
  5. Réponses: 0
    Dernier message: 05/12/2007, 14h13

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