Ich weiß, dass dies ein alter Beitrag ist, aber ich denke, dass dies ein sehr wichtiges Thema ist, insbesondere heutzutage, wo wir über 10 Millionen Datensätze haben und über Terabytes an Daten sprechen.
Ich werde auch auf die folgenden Beobachtungen eingehen. Ich habe ungefähr 45 Millionen Datensätze in meiner Tabelle ([Daten]) und ungefähr 300 Datensätze in meiner [Katzen] -Tabelle. Ich habe eine umfangreiche Indizierung für alle Abfragen, über die ich sprechen werde.
Betrachten Sie Beispiel 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
versus Beispiel 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
Beispiel 1 dauerte ungefähr 23 Minuten, um zu laufen. Beispiel 2 dauerte ungefähr 5 Minuten.
Daher würde ich zu dem Schluss kommen, dass die Unterabfrage in diesem Fall viel schneller ist. Denken Sie natürlich daran, dass ich M.2-SSD-Laufwerke verwende, die E / A mit 1 GB / s unterstützen (das sind Bytes, keine Bits), daher sind meine Indizes auch sehr schnell. Dies kann sich also unter Ihren Umständen auch auf die Geschwindigkeit auswirken
Wenn es sich um eine einmalige Datenbereinigung handelt, lassen Sie sie wahrscheinlich am besten laufen und beenden. Ich verwende TOP (10000) und sehe, wie lange es dauert, und multipliziere mit der Anzahl der Datensätze, bevor ich die große Abfrage treffe.
Wenn Sie Produktionsdatenbanken optimieren, würde ich dringend empfehlen, Daten vorzuverarbeiten, dh Trigger oder Job-Broker zu verwenden, um Aktualisierungsdatensätze zu asynchronisieren, damit der Echtzeitzugriff statische Daten abruft.