web-dev-qa-db-fra.com

INNER JOIN vs INNER JOIN (SELECT. FROM)

Existe-t-il une différence de performances entre ces deux versions de la même requête?

--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

J'ai entendu dire par un administrateur de base de données que la version 2 était plus rapide car elle récupérait, dans l'instruction SELECT interne, uniquement les colonnes requises pour la requête. Mais cela ne semble pas logique, car les performances des requêtes (comme je le sais) sont basées sur le nombre de lignes affectées et la liste finale des colonnes renvoyée.

Les plans de requête pour les deux sont identiques, donc je suppose qu'il n'y a pas de différence entre les deux.

Ai-je raison?

51
Karun

Vous avez raison. Vous avez fait exactement ce qu'il fallait, en vérifiant le plan de requête plutôt qu'en essayant de deviner l'optimiseur. :-)

38
Christian Hayter

Il n'y aura pas beaucoup de différence. Cependant, la version 2 est plus facile lorsque vous avez des calculs, des agrégations, etc. qui doivent être joints en dehors de celle-ci.

--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 
10
Madhivanan

Semble identique au cas où SQL Server n'essaiera pas de lire des données non requises pour la requête, l'optimiseur est suffisamment intelligent

Cela peut avoir un sens quand on joint une requête complexe (c'est-à-dire qui ont des jointures, des regroupements, etc.), alors oui, il est préférable de spécifier les champs obligatoires.

Mais il y a un autre point. Si la requête est simple, il n'y a pas de différence, mais CHAQUE action supplémentaire même si elle est supposée améliorer les performances oblige l'optimiseur à travailler plus fort et l'optimiseur peut ne pas obtenir le meilleur plan à temps et n'exécutera pas la requête optimale. Donc, les extras de sélection peuvent être une telle action qui peut même diminuer les performances

0
Vladmir