2010-07-30 19 views
7

whos könnte viel effizienter sein, wenn ich nestted subquery verwenden, JOINs Oder vielleicht temp tables .. eine andere Frage: in Subqueries wenn i IN-Klausel verwenden zweimal mit der gleichen Abfrage sollte es zweimal ausführen werden!? wie folgt aus:verschachtelte Abfrage vs Joins

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

wie oft Unter Abfrage SELECT * FROM Y konnte in dieser Abfrage ausgeführt werden!
und was ist, wenn ich auf diese Weise verwenden, dies zu tun:

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 :)

Antwort

4

Die beiden Abfragen sind gleichwertig und sollten identische Pläne erzeugen. Es ist ein Missverständnis, dass CTEs nur einmal kompiliert werden, was einen Leistungsvorteil bringt. Nicht-rekursive CTEs sind nur syntaktische Zucker für abgeleitete Tabellen/Inline-Ansichten (IMO fälschlicherweise als Unterabfragen bezeichnet).

Zweitens können JOINs vs IN/EXISTS unterschiedliche Ergebnisse erzeugen. JOINs riskieren duplizierte Daten, wenn zwei oder mehr unterstützende Datensätze vorhanden sind. EXISTS wird am besten verwendet, wenn doppelte Kriterien vorhanden sind, da es bei der ersten Begegnung der Kriterien den Wert true zurückgibt und es möglicherweise schneller als IN oder JOIN macht. Bei der Verwendung von EXISTS oder IN besteht kein Risiko der Datenduplizierung.

+0

danke viel mann :) – Rawhi

0

Joins sind viel schneller als die anderen Vorschläge, die Sie gemacht.

Joins führen die ON-Bedingung für jeden Datensatz aus, während das Auswählen mit einem WHERE alle Datensätze zuerst einliest, dann den Filter durchführt und somit viel langsamer ist.

Joins den ganzen Weg !!

+0

aber wenn ich deutlich damit umgehen sollte, wird es immer noch nicht so schnell wie die anderen .. richtig? – Rawhi

+0

@Paul Flüche, du schlägst mich dazu. –

+0

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

2

Verwenden Sie den Ausführungsplan in SQL Server Management Studio und sehen Sie selbst, was schneller für Ihre Datenbank ausgeführt wird.

+0

Ich habe versucht, es herunterzuladen, aber ich scheiterte hh !! – Rawhi

+0

Die Express-Version ist leicht verfügbar und funktioniert in der Regel: http: // www.microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=en –

2

Zuerst Ihre Syntax wahrscheinlich incorrect.Thus ist, die beiden Formate würde wie folgt aussehen:

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

Und

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) 

Beachten Sie die Anweisungen gibt. Sie sind nicht Where Col Exists(..., sondern sind nur Where Exists(....

Zweitens hängt die Effizienz und Geschwindigkeit von den Daten, Statistiken, Indizes und am Ende des Tages ab, was der Optimierer effizienter machen kann. Daher müssen Sie sich wirklich den Ausführungsplan ansehen, um zu wissen, welcher schneller ist. Nun könnte ein anderes Formular sein:

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

danke .......: D – Rawhi

Verwandte Themen