Digamos que tenemos dos tablas: 'coche' y 'parte', con una mesa de unirse en 'Car_Part'. Supongamos que quiero ver todos los automóviles que tienen una parte 123 en ellos. Yo podría hacer esto:¿Qué es más rápido: ÚNASE con GROUP BY o una subconsulta?
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
O podría hacer esto
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)
Ahora, todo en mí quiere usar el primer método, ya que he sido educado por los buenos padres que me inculcaron una odio puritano de subconsultas y amor por la teoría de conjuntos, pero se me ha sugerido que hacer ese gran GRUPO BY es peor que una subconsulta.
Debo señalar que estamos en SQL Server 2008. También debo decir que en realidad quiero seleccionar en base al ID de la franja, Parte Tipo y posiblemente otras cosas también. Por lo tanto, la consulta que quiero hacer en realidad se parece a esto:
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
O ...
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))
¿Has ejecutado ambos? Miró los planes de consulta? Benchmarked? – Oded
Tendría que generar una gran cantidad de datos, por lo que no lo resolveré hasta la próxima semana. Y cuando buscaba una respuesta en Google, no encontré ninguna, así que vale la pena publicar una pregunta en línea para cualquier otra persona que pueda estar buscando. – d4nt
Agrupar por es un trabajo intensivo, que se usa para calcular cosas como promedios, sumas, etc. Pareces usarlo para eliminar duplicados. Pruebe DISTINCT sin el grupo por ... – Alocyte