SQL Server - joindre ou sous-requête dans les déclarations de mise à jour?
-
19-09-2019 - |
Question
Y at-il une raison d'utiliser l'une de ces instructions UPDATE sur l'autre en ce qui concerne la performance?
UPDATE myTable
SET fieldx = 1
FROM myTable AS mt
, myView AS mv
WHERE mt.id = mv.id
UPDATE myTable
SET fieldx = 1
WHERE id IN ( SELECT id
FROM myView )
La solution
Ils vont probablement sortir avec le même plan d'exécution, ce qui signifie qu'il n'y a aucune différence. Pour confirmer, essayez chacun dans SSMS avec l'option « Inclure le plan d'exécution » activée.
En fait, celui que je pencherais pour est:
UPDATE mt
SET mt.fieldx = 1
FROM myTable mt
JOIN myView mv ON mt.ID = mv.ID
Je préfère de beaucoup cette syntaxe. Bien que, elle aussi viendra avec le même plan d'exécution.
Pour démontrer cela, j'ai couru un test avec chaque variante de l'instruction UPDATE. Comme l'exécution des plans ci-dessous montrent, ils sont tous venus le même - tous effectuer les mêmes:
texte alt http://img707.imageshack.us/img707/7801/60422461.png
texte alt http://img683.imageshack.us/img683/7874/41210682.png
texte alt http://img708.imageshack.us/img708/5020/20506532.png
Autres conseils
Bien que cela ne parle pas à la performance, j'aime le premier exemple mieux pour que je puisse plus facilement vétérinaire sans changer la structure sous-jacente du code. Remarquez où et ce que je mets dans les commentaires:
UPDATE myTable
SET fieldx = 1
--SELECT *
FROM myTable AS mt
, myView AS mv
WHERE mt.id = mv.id