Предположим, у нас есть две таблицы: «Автомобиль» и «Часть», с соединительной таблицей в «Car_Part». Скажем, я хочу видеть все автомобили, в которых есть часть 123. Я мог бы сделать это:Что происходит быстрее: присоединяйтесь к GROUP BY или подзапрос?
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
Или я мог бы сделать это
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)
Теперь все во мне хочет использовать первый метод, потому что я был воспитан хорошими родителями, которые привили мне пуританскую ненависть к подзапросам и любовь к теории множеств, но мне было предложено, что выполнение этой большой GROUP BY хуже, чем подзапрос.
Я должен указать, что мы на SQL Server 2008. Я также должен сказать, что на самом деле я хочу выбрать на основе идентификатора части, типа детали и, возможно, других вещей. Таким образом, запрос я хочу сделать на самом деле выглядит следующим образом:
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
Или ...
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))
Вы запустили оба? Посмотрел планы запросов? Обозначил это? – Oded
Мне пришлось бы генерировать нагрузку данных, поэтому я не буду обходить ее до следующей недели. И когда я искал Google для ответа, я не нашел его, поэтому стоит задать вопрос онлайн для всех, кто может смотреть. – d4nt
Group By is трудоемкий, используемый для вычисления таких вещей, как средние, суммы и т. Д. Вы, кажется, используете его для устранения дубликатов. Попробуйте DISTINCT без группы ... – Alocyte