Datenbank Massenverarbeitung

  • 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:

    Code
    1. MariaDB [employees]> update titles01 set title = replace(title, 'Senior', 'Test123') where title like '%Senior%';
    2. Query OK, 190603 rows affected (8.34 sec)
    3. Rows matched: 190603 Changed: 190603 Warnings: 0

    ohne:

    Code
    1. MariaDB [employees]> update titles11 set title = replace(title, 'Senior', 'Test123');
    2. Query OK, 190603 rows affected (7.85 sec)
    3. 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:

    Code
    1. MariaDB [employees]> update titles15 set title = replace(title, 'Senior', 'Test123');
    2. Query OK, 0 rows affected (1.49 sec)
    3. 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. ^^:thumbup:


    Edit: Testergebisse als txt angefügt.

  • Fachchinesisch hoch zehn :D.


    Mir ist es einerlei :saint:.


    Der Code hat prima geklappt und hat in Sekunden über 3000 Einträge korrigiert, für die ich sonst eine Ewigkeit gebraucht hätte.


    Aber toll, daß sich hier so viele damit auskennen. Da weiß ich im Bedarfsfall wen ich nerven kann :P:D.

  • Ist das in diesem Fall tatsächlich so?

    In einfachen Fällen kann das Schreiben bestimmt wegoptimiert werden (siehe Link auf MS-SQL weiter oben), generell sicherlich nicht.

    Ich kenne leider keine Möglichkeit, von MySql die Anzahl der geschriebenen Seiten pro Statement zu bekommen.

    Ein Test mit einem Trigger an der Tabelle hat ergeben, dass der Trigger aufgerufen wird, auch wenn MySql korrekt „Changed: 0“ erkennt. Einigen wir uns auf „es kommt drauf an“?


    Gute Nacht allerseits!