Diciamo che abbiamo due tabelle: "Auto" e "Parte", con una tabella di unione in "Car_Part". Diciamo che voglio vedere tutte le auto che hanno una parte 123 in loro. Ho potuto fare questo:Qual è più veloce: UNISCI con GROUP BY o una sottoquery?
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
Oppure potrei fare questo
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)
Ora, tutto in me vuole utilizzare il primo metodo perché sono stato allevato da buoni genitori che ha instillato in me un odio puritano di subquery e amore per la teoria degli insiemi, ma mi è stato suggerito che fare quel grosso GROUP BY è peggio di una subquery.
Devo sottolineare che siamo su SQL Server 2008. Devo anche dire che in realtà voglio selezionare basato su Id della parte, Tipo di parte e forse anche su altre cose. Quindi, la domanda che voglio fare oggi si presenta in questo modo:
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
Oppure ...
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))
Avete eseguito entrambi? Hai visto i piani di query? Benchmarked esso? – Oded
Dovrei generare un carico di dati, quindi non ci arriverò fino alla prossima settimana. E quando ho cercato su Google una risposta, non ne ho trovato uno, quindi vale la pena postare una domanda online per chiunque altro stia cercando. – d4nt
Group By è laborioso, usato per calcolare cose come medie, somme, ecc. Sembra che tu lo stia usando per eliminare i duplicati. Prova DISTINCT senza il gruppo di ... – Alocyte