Подтвердить что ты не робот

INNER JOIN vs INNER JOIN (SELECT FROM)

Есть ли разница в производительности между этими двумя версиями одного и того же запроса?

--Version 1
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN SalesOrderDetail s on p.ProductID = s.ProductID

--Version 2
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s on p.ProductID = s.ProductID

Я слышал, что он сказал (от администратора базы данных), что версия 2 работает быстрее, потому что она извлекает внутри внутреннего оператора SELECT только те столбцы, которые необходимы для запроса. Но это не имеет смысла, поскольку производительность запросов (как я знаю) основана на количестве затронутых строк и окончательном списке возвращенных столбцов.

Планы запросов для обоих идентичны, поэтому я предполагаю, что между ними нет никакой разницы.

Правильно ли я?

4b9b3361

Ответ 1

Вы правы. Вы сделали именно то, что нужно, проверяя план запроса, а не пытающийся вторгаться в оптимизатор.: -)

Ответ 2

Не будет большой разницы. Howver версия 2 проще, когда у вас есть некоторые вычисления, скопления и т.д., Которые должны быть соединены за пределами нее

--Version 2 
SELECT p.Name, s.OrderQty 
FROM Product p 
INNER JOIN 
(SELECT ProductID, SUM(OrderQty) as OrderQty FROM SalesOrderDetail GROUP BY ProductID
HAVING SUM(OrderQty) >1000) s 
on p.ProductID = s.ProdctId 

Ответ 3

Кажется, что он идентичен только в том случае, если SQL-сервер не будет пытаться читать данные, которые не требуются для запроса, оптимизатор достаточно умный

Он может иметь смысл при объединении в сложный запрос (т.е. который имеет собственные команды, группировки и т.д.), тогда да, лучше указать обязательные поля.

Но есть еще один момент. Если запрос прост, нет никакой разницы, но КАЖДОЕ дополнительное действие, даже предполагающее повышение производительности, оптимизирует работу, и оптимизатор может не получить наилучший план вовремя и запустить не оптимальный запрос. Таким образом, дополнительный выбор может быть таким действием, которое может даже снизить производительность

Ответ 4

Вы поступили правильно, выполнив проверку планов запросов. Но у меня есть 100% -ная уверенность в версии 2. Это быстрее, когда записи с номерами находятся на очень высокой стороне.

Моя база данных насчитывает около 1 000 000 записей, и это именно тот сценарий, в котором в плане запроса отображается разница между этими двумя запросами. Кроме того, вместо использования предложения where, если вы используете его в самом соединении, он делает запрос быстрее:
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s на p.ProductID = s.ProductID WHERE p.isactive = 1

Лучшая версия этого запроса:

SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s на p.ProductID = s.ProductID AND p.isactive = 1

(Предполагая, что isactive является полем в таблице продуктов, которое представляет активные/неактивные продукты).