2010-07-30 7 views
7

Whos SE JOINT pourrait être beaucoup plus efficace si j'utilise nestted subquery, JOINs Ou peut-être temp tables .. autre question: si je dans les sous-requêtes utilise à l'article deux fois avec la même requête devrait être exécuter deux fois par trop! comme ceci:requête imbriquée vs

Select ... 
From X 
Where Exists(Select 1 From Y Where Idx = Y.SomeColumn) 
Or Exists(Select 1 From Y Idy = Y.SomeColumn) 

combien de fois la sous-requête SELECT * FROM Y pourrait être exécuté dans cette requête!
et si je l'utilise de cette façon de le faire:

With XX As 
(
Select ... 
From Y 
) 
Select ... 
From X 
Where Exists (Select 1 From XX Where Idx = XX.SomeColumn) 
Or Exists (Select 1 From XX Where Idy = XX.SomeColumn) 

:) Thanx

Répondre

4

Les deux requêtes sont équivalentes et doivent produire des plans identiques. C'est une idée fausse que les CTE sont compilés une seule fois, ce qui procure un avantage de performance. Les CTE non récursifs ne sont que du sucre syntaxique pour les tables/vues en ligne dérivées (IMO désignées à tort sous le nom de sous-requêtes).

Deuxièmement, JOINs vs IN/EXISTS peut produire des résultats différents. JOINs risque de dupliquer les données, s'il y a deux enregistrements de support ou plus. Il est préférable d'utiliser EXISTS s'il existe des critères en double, car il renvoie true lors de la première rencontre des critères, ce qui le rend potentiellement plus rapide que IN ou JOIN. Il n'y a pas de risque de duplication de données lors de l'utilisation de EXISTS ou IN.

+0

Merci beaucoup :) – Rawhi

0

jointures sont beaucoup plus rapidement que les autres suggestions que vous avez faites. Joins effectuera la condition ON pour chaque enregistrement alors que faire des sélections avec un WHERE tirera d'abord tous les enregistrements, puis effectuera le filtre, étant ainsi beaucoup plus lent.

Se joint tout le chemin !!

+0

mais si je devais utiliser distinct avec lui, il ne sera pas encore rapide autant que les autres .. non? – Rawhi

+0

@Paul Curses, tu m'as battu dessus. –

+0

AHA ....... !!!! – Rawhi

2

Utilisez le plan d'exécution dans SQL Server Management Studio et voyez par vous-même ce qui s'exécute plus rapidement dans votre base de données.

+0

j'ai essayé de le télécharger, mais j'ai échoué hh !! – Rawhi

+0

La version express est facilement disponible et fonctionne habituellement: http: // www.microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=fr –

2

D'abord, votre syntaxe est probablement incorrect.Thus, les deux formats se ressemblent:

Select ... 
From X 
Where Exists(Select 1 From Y Where Idx = Y.SomeColumn) 
    Or Exists(Select 1 From Y Idy = Y.SomeColumn) 

Et

With XX As 
    (
    Select ... 
    From Y 
    ) 
Select ... 
From X 
Where Exists (Select 1 From XX Where Idx = XX.SomeColumn) 
    Or Exists (Select 1 From XX Where Idy = XX.SomeColumn) 

Notez les déclarations Existant. Ils ne sont pas Where Col Exists(... mais sont simplement Where Exists(.... Deuxièmement, l'efficacité et la rapidité dépendront des données, des statistiques, des index et, en fin de compte, de ce que l'optimiseur peut rendre plus efficace. Ainsi, vous devez vraiment regarder le plan d'exécution pour savoir lequel est le plus rapide. Maintenant, une autre forme peut être:

Select ... 
From X 
Where Exists (
       Select 1 
       From Y 
       Where Idx = Y.SomeColumn 
       Union All 
       Select 1 
       From Y 
       Where Idy = Y.SomeColumn 
       ) 
+0

merci .......: D – Rawhi

Questions connexes