Nehmen wir an, wir haben zwei Tabellen: 'Car' und 'Part', mit einer Verbindungstabelle in 'Car_Part'. Sagen wir, ich möchte alle Autos sehen, die einen Teil 123 haben. Ich kann dies tun:Was ist schneller: JOIN mit GROUP BY oder eine Unterabfrage?
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
INNER JOIN Car_Part ON Car_Part.Car_Id = Car.Car_Id
WHERE Car_Part.Part_Id = @part_to_look_for
GROUP BY Car.Col1, Car.Col2, Car.Col3
Oder ich könnte diesen
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
WHERE Car.Car_Id IN (SELECT Car_Id FROM Car_Part WHERE Part_Id = @part_to_look_for)
Jetzt tun, alles, was in mir will die erste Methode verwenden, weil ich oben von gut Eltern gebracht worden bin, der in mir eingeflößt ein Puritanischer Hass auf Sub-Queries und eine Liebe zur Mengenlehre, aber es wurde mir vorgeschlagen, dass das große GROUP BY schlechter ist als eine Sub-Query.
Ich sollte darauf hinweisen, dass wir auf SQL Server 2008 sind. Ich sollte auch sagen, dass in der Realität möchte ich die Teil-ID, Part Type und möglicherweise auch andere Dinge auswählen. Also, die Abfrage, die ich tun möchte, sieht tatsächlich wie folgt aus:
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
INNER JOIN Car_Part ON Car_Part.Car_Id = Car.Car_Id
INNER JOIN Part ON Part.Part_Id = Car_Part.Part_Id
WHERE (@part_Id IS NULL OR Car_Part.Part_Id = @part_Id)
AND (@part_type IS NULL OR Part.Part_Type = @part_type)
GROUP BY Car.Col1, Car.Col2, Car.Col3
Oder ...
SELECT Car.Col1, Car.Col2, Car.Col3
FROM Car
WHERE (@part_Id IS NULL OR Car.Car_Id IN (
SELECT Car_Id
FROM Car_Part
WHERE Part_Id = @part_Id))
AND (@part_type IS NULL OR Car.Car_Id IN (
SELECT Car_Id
FROM Car_Part
INNER JOIN Part ON Part.Part_Id = Car_Part.Part_Id
WHERE Part.Part_Type = @part_type))
Haben Sie beides ausgeführt? Blick auf die Abfragepläne? Benchmarked es? – Oded
Ich müsste eine Menge Daten generieren, also komme ich erst nächste Woche dazu. Und als ich nach einer Antwort gegoogelt habe, habe ich keine gefunden, also lohnt es sich, online eine Frage für alle anderen zu stellen. – d4nt
Group By ist arbeitsintensiv, verwendet um Dinge wie Durchschnittswerte, Summen usw. zu berechnen. Sie scheinen es zu benutzen, um Dubletten zu eliminieren. Versuchen Sie DISTINCT ohne die Gruppe von ... – Alocyte