login nestede vs sous-requête nestede

Dans ce scénario, tous les entrepreneurs passent chaque jour une command pour divers articles en stock. Ces données sont stockées dans la table ContractorOrder. Lorsque le stock est reçu, les valeurs sont enregistrées et enregistrées dans la table ContractorStock. Il n'est pas possible que les éléments de ligne apparaissent dans la table ContractorStock s'ils n'existent pas dans la table ContractorOrder.

Parfois, cependant, certains articles ne sont pas livrés, ou les quantités incorrectes sont livrés, ou les entrepreneurs ont oublié de passer une command. Pour vérifier ceci, j'ai écrit ces deux requêtes (ignorer la situation où les sums sont les mêmes mais les différents éléments de ligne diffèrent – ceci est juste un exemple simplifié):

SELECT C.ContractorId , C.ContractorName , Sum(CO.Quantity) OrderQuantity , Sum(CS.Quantity) ContractorQuantity FROM [Contractor] C LEFT JOIN ContractorOrder CO ON C.ContractorId = CO.ContractorId AND CO.Date = @date LEFT JOIN ( ContractorStock CS JOIN StockCode SC ON CS.StockCodeId = SC.StockCodeId AND CS.Date = @date ) ON CS.ContractorId = C.ContractorId AND SC.StockCode = CO.StockCode GROUP BY C.ContractorId , C.ContractorName 

http://sqlfiddle.com/#!6/55496/5

Et:

 SELECT C.ContractorId , C.ContractorName , Sum(CO.Quantity) OrderQuantity , Sum(CS.Quantity) ContractorQuantity FROM [Contractor] C LEFT JOIN ContractorOrder CO ON C.ContractorId = CO.ContractorId AND CO.Date = @date LEFT JOIN ( SELECT CS.ContractorId , SC.StockCode , CS.Quantity FROM ContractorStock CS JOIN StockCode SC ON CS.StockCodeId = SC.StockCodeId AND CS.Date = @date ) CS ON CS.ContractorId = C.ContractorId AND CS.StockCode = CO.StockCode GROUP BY C.ContractorId , C.ContractorName 

http://sqlfiddle.com/#!6/55496/2

Les deux returnnent les mêmes résultats, mais il y a une légère différence dans les plans d'exécution. Ces requêtes ne sont-elles pas logiquement équivalentes dans cette situation? Si c'est le cas, devrais-je préférer la jointure nestede?

Joie nestede

entrez la description de l'image ici

Sous-requête:

entrez la description de l'image ici

Ce que vous venez de prouver (quand il s'agit de différents types de requêtes) est que vous devriez laisser SQL Server déterminer le meilleur plan (comme les versions SQL remontent le moteur devient de mieux en mieux à find le meilleur plan de requête) et vous devriez vous concentrer écriture SQL qui produit des résultats corrects qui sont basés sur.

La seule différence que je vois est une étape de mise à l'échelle de calcul qui est plus proche de 0% du plan total, donc ça ne vaut pas la peine de passer beaucoup de time à l'éliminer.

Dans l'ancien time (pré-SQL Server 2000), il importait réellement si vous écriviez des jointures vs des sous-requêtes. Maintenant, dans la grande majorité des cas, il n'est pas payant de changer une sous-requête en une jointure ou vice versa.

Vous voulez toujours éviter les opérations ligne par ligne et replace, si possible, les balayages par les searchs, mais une fois que vous avez fait cela, passez à autre chose.