Jointure interne et sous-requête SQL Server

J'ai ci-dessous la requête qui met à jour certains identifiants sur HierarchicalTable .

Ma première requête est stable mais j'ai un problème sur sa performance:

 DECLARE @targetName varchar(100) UPDATE a SET a.PrimaryId = b.PrimaryId , a.SecondaryId = b.SecondaryId FROM ( SELECT PrimaryId , SecondaryId FROM Hierarchical WHERE ParentName = @targetName ) as a JOIN ( SELECT PrimaryId , SecondaryId FROM Hierarchical WHERE Name = @targetName ) b ON a.ParentId = b.Id 

Cette requête suivante est ma deuxième option:

 DECLARE @targetName varchar(100) UPDATE a SET a.PrimaryId = b.PrimaryId , a.SecondaryId = b.SecondaryId FROM Hierarchical a JOIN Hierarchical b ON a.ParentId = b.Id WHERE a.ParentName = @targetName AND b.Name = @targetName 

Mes questions sont:

  1. La deuxième requête s'exécute-t-elle exactement comme la première requête?

  2. La deuxième requête surpassera-t-elle la première requête?

* Note: J'ai une grande échelle de données, et nous avons des problèmes de matériel lors de l'exécution de ces requêtes.

J'ai posté ici à SO afin que je puisse avoir des opinions que je peux voir.

Votre première requête ne s'exécutera pas car il manque une clause on. Laissez-moi supposer que la clause on est vraiment a.Id = b.Id

La question que vous posez concerne la façon dont la requête est optimisée. Le vrai moyen de répondre est de regarder le plan de requête, que vous pouvez facilement voir dans SQL Server Management Studio. Vous pouvez commencer avec la documentation pour suivre ce path.

Dans votre cas, cependant, vous utilisez les sous-requêtes pour dire "faire le filtrage quand vous lisez datatables". En fait, SQL Server pousse généralement de telles opérations de filtrage jusqu'à la table lue, donc les sous-requêtes sont probablement superflues.

Si vous voulez améliorer les performances, je suggère que vous ayez les index suivants sur la table: hierarchical(parentname, id) et hierarchical(name, id) . Ceux-ci devraient probablement donner un bon coup de pouce de performance.