Je sais que c'est un ancien message, mais je pense que c'est un sujet très important, surtout de nos jours où nous avons plus de 10 millions d'enregistrements et parlons de téraoctets de données.
Je vais également appuyer les observations suivantes. J'ai environ 45 millions d'enregistrements dans ma table ([data]) et environ 300 enregistrements dans ma table [cats]. J'ai une indexation complète pour toutes les requêtes dont je vais parler.
Prenons l'exemple 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
par rapport à l'exemple 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
L'exemple 1 a duré environ 23 minutes. L'exemple 2 a pris environ 5 minutes.
Je conclurais donc que la sous-requête dans ce cas est beaucoup plus rapide. Bien sûr, gardez à l'esprit que j'utilise des disques SSD M.2 capables d'entrées / sorties à 1 Go / s (ce sont des octets et non des bits), donc mes index sont également très rapides. Cela peut donc également affecter les vitesses dans votre situation
S'il s'agit d'un nettoyage de données ponctuel, il est probablement préférable de le laisser s'exécuter et de terminer. J'utilise TOP (10000) et je vois combien de temps cela prend et je multiplie par le nombre d'enregistrements avant de lancer la grande requête.
Si vous optimisez des bases de données de production, je suggérerais fortement de pré-traiter les données, c'est-à-dire d'utiliser des déclencheurs ou un job-broker pour asynchroniser les enregistrements de mise à jour, de sorte que l'accès en temps réel récupère les données statiques.