2016-06-25 17 views
0

ich eine Abfrage, die wie folgt aussieht:SQL Performance - Filtering auf Abfrage vor oder nach den Gewerkschaften

SELECT PersonId, 
     Note, 
     Amount 
FROM Table1 A 
WHERE A.PersonId = @PersonId 

UNION 

SELECT PersonId, 
     Note, 
     Amount 
FROM Table2 B 
WHERE B.PersonId = @PersonId 

UNION 

SELECT PersonId, 
     Note, 
     Amount 
FROM Table3 C 
WHERE C.PersonId = @PersonId 

nun diese Abfrage Tausende von Ergebnissen wird schließlich zurückkehren und so mag ich möglich, die beste Performance-Abfrage erstellen . Ich möchte wissen, ob das effizienter ist als Filterung auf PersonId nach den Gewerkschaften wie folgt aus:

SELECT * FROM 
(
SELECT PersonId, 
     Note, 
     Amount 
FROM Table1 A 

UNION 

SELECT PersonId, 
     Note, 
     Amount 
FROM Table2 B 

UNION 

SELECT PersonId, 
     Note, 
     Amount 
FROM Table3 C 
) A 
WHERE A.PersonId = @PersonId 

Antwort

0

Zuerst überhaupt erhalten Sie einen Abfrageoptimierer haben.
Es wird keinen Geschwindigkeitsunterschied geben, da sich die PersonId auf der Anzeigeebene befindet.
Der Abfrageoptimierer ändert die Ausführungsreihenfolge der Anzeigeparameter, so dass nur eine minimale Anzahl von Parametern vorhanden ist.
Also beide Abfragen werden gleich schnell sein.
Wenn Sie interessiert sind, können Sie diesen Ausführungsplan in Ihrem SQL-Entwickler sehen.

+0

Wäre es mit Joins das Gleiche? Beitritt zu jeder Abfrage im Gegensatz zu am Ende? – Walker

+0

Probieren Sie es selbst in Ihrem SQL-Entwickler. Vergleichen Sie beide und Sie werden Ihr Ergebnis haben. Soweit ich denke, Joins könnte schneller sein. Ich denke, der Abfrageoptimierer wird Ihre Union-Abfrage zu einer Join-Abfrage rekonstruieren. So wäre es schneller mit Joins. Aber warum ist deine PersonID kein Primärschlüssel? – thirstyAndreas