Ohne die Where-Klausel wird jeder Datensatz in die Datenbank zurückgeschrieben, mit dem where nur, wenn auch ein Treffer stattgefunden hat.
Ist das in diesem Fall tatsächlich so?
Habe mir mal eine gut gefüllte Testdatenbank gezogen und einige Update-Durchläufe vorgenommen.
Den Test habe ich zum Vergleich mehrmals wiederholt, die Zeiten bewegen sich in vergleichbaren Rahmen (+/- 1 sec, im Durchschnitt 8,1 sec).
mit where-Klausel:
MariaDB [employees]> update titles01 set title = replace(title, 'Senior', 'Test123') where title like '%Senior%';
Query OK, 190603 rows affected (8.34 sec)
Rows matched: 190603 Changed: 190603 Warnings: 0
ohne:
MariaDB [employees]> update titles11 set title = replace(title, 'Senior', 'Test123');
Query OK, 190603 rows affected (7.85 sec)
Rows matched: 443308 Changed: 190603 Warnings: 0
Er matched ohne where-Klausel mehr Datensätze, ändert (changed) aber in beiden Fällen lediglich 190.603 Zeilen. Die Zeiten sind im Durchschnitt auch identisch - ohne where sogar einen Ticken schneller, aber das schiebe ich auf Messtoleranzen.
Zum Vergleich nochmal ein wiederholtes Update-Query auf eine bereits geänderte Tabelle:
MariaDB [employees]> update titles15 set title = replace(title, 'Senior', 'Test123');
Query OK, 0 rows affected (1.49 sec)
Rows matched: 443308 Changed: 0 Warnings: 0
Changed: 0
Sieht mir also schon danach aus, als ob der SQL-Server das intern bereits beim Replace() optimiert und filtert. Leider finde ich dazu keine Referenz und wüsste lediglich gern, ob es nun wirklich nötig (bei Verwendung der Replace-Funktion!) ist eine separate where-Klausel zu nutzen, die in anderen Szenarien natürlich sinnvoll ist, das steht außer Frage.
Die Tabelle hat jetzt zwar nur eine knappe halbe Million Datensätze, aber ich denke schon, dass wir uns hier in vergleichbar größeren Testregionen bewegen.
Gruß, René
PS: Wirklich interessant zu welchen Diskussionen ein einfacher Domainwechsel so führen kann.
Edit: Testergebisse als txt angefügt.