Frage

Ich habe eine Tabelle, die Informationen über Städte in einem Spiel hält, können Sie bauen ein Gebäude in jeder Runde und dies wird mit dem Wert „usedBuilding“ aufgezeichnet.

Jeder schalte ich ein Skript ausführen, das auf 0 verändert usedBuilding, ist die Frage, welche die folgenden zwei Möglichkeiten, schneller ist und tut es tatsächlich unabhängig davon, welche Art und Weise verwendet wird?

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
War es hilfreich?

Lösung

Im Allgemeinen ist der zweite Fall (mit der WHERE) Klausel schneller wäre -., Da es nicht Trigger Auswertung, die Transaktionsprotokollierung, eine Indexaktualisierung verursacht, usw. auf den nicht verwendeten Zeilen

Potenziell - in Abhängigkeit von der Verteilung von 0/1 Werten, könnte es tatsächlich schneller sein, alle Zeilen zu aktualisieren, anstatt den Vergleich zu tun -. Aber das ist ein ziemlich degenerierter Fall

Da ~ 95% der Anfrage Kosten I / O, mit dem WHERE-Klausel entweder keinen Unterschied machen (da die Spalte nicht indiziert ist, und Sie tun ein Table-Scan) oder einen großen Unterschied (wenn die Spalte indiziert ist, oder die Tabelle partitioniert, etc.). So oder so, es tut nicht weh.

ich, dass für die Menge an Daten vermuten würde Sie sprechen, werden Sie keinen Unterschied in beiden Ausführungsplänen oder Geschwindigkeit feststellen - die es bestenfalls vorzeitige Optimierung im schlimmsten Fall akademischen macht. Also, ich würde empfehlen, mit zu gehen, was logisch ist sinnvoll für Ihre Anwendung.

Andere Tipps

Wenn usedBuilding indiziert ist, wird es schneller sein, die where-Klausel zu verwenden, da es nur Zugang / Update Zeilen, in denen usedBuilding wahr sind. Wenn es nicht indiziert ist, dann würden Sie eine vollständige Tabelle sowieso tun scannen, so wäre es nicht viel machen (alle?) Unterschied.

Versuchen Sie beide Richtungen in einer Schleife ein paar tausend Mal und Zeit, um sie! Es hängt wahrscheinlich von: wie viele Datensätze tatsächlich in dieser Tabelle sind, und ob sie alle in den Speicher passen oder müssen Datenträger ausgelagert werden. Wie viele Gebäude sind auf dem Wert 1, bevor Sie das Update ausführen (ich dieses Erraten 1 sein könnte).

Es spielt keine Rolle, welche Art und Weise verwendet wird, aber die kürzeste ist bekam wahrscheinlich die am wenigsten, die mit ihm schief gehen kann. Code, den Sie nicht schreiben kann keine Fehler hat.

Wie oft werden diese Kurven passiert? Wie viele Zeilen erwarten Sie in dieser Tabelle haben? Wenn die Antworten sind ‚weniger als einmal pro Sekunde‘ und ‚weniger als 10000‘, nur aufhören, sich Sorgen.

Es sei denn, wenn Sie geschehen, eine Art von akademischem Interesse daran haben, natürlich.

Es scheint, wie es eine geringere Anzahl von Transaktionen würden die machen „UPDATE Städte SET usedBuilding = 0;“ ausführen als die spezifischere Abfrage. Der Hauptgrund, warum ich von gegen diese denken kann, wäre, wenn Sie mehr als einen Staat auf Ihre Kolonne hatte. Wenn es nur ein boolean dann wäre es in Ordnung sein, aber man kann einige Zeit denken will, verbringen, wenn das wird immer der Fall sein.

Indizierung könnte auch der Ausführungsplan verursacht effizienter mit der WHERE-Klausel sein.

Der beste Weg, um eine definitive Antwort zu bekommen wäre eine Menge Beispieldaten unter verschiedenen Szenarien zum Profil verwendet wird.

Indizierung werden Ihnen nicht helfen, wenn Sie so etwas wie vielleicht 2% des usedBuilding = 1 Wertes haben.

aber diese 2 Aussagen logisch unterschiedlich und völlig verschiedene Dinge bedeuten kann. aber wenn für Ihren Fall, dass sie gleich sind, dann verwenden Sie das eine ohne das where-Klausel.

Wie viele Zeilen genau haben Sie? Ich vermute, dass für ein kleineres Online-Spiel, die Sie wirklich egal.

Wenn Sie mehrere Aktualisierungen des „Städte“ Tisch tun, könnte es eine gute Idee sein, sie alle in einer UPDATE-Anweisung zu tun, wenn möglich.

zu einer Reihe wohl jede Veränderung zu machen dauert nur so viel I / O als die gesamte Zeile zu schreiben (außer natürlich Aktualisierung indizierten Spalten erfordert auch Index schreibt), so dass Sie, indem sie mehrere UPDATEs verlieren, die viele Zeilen betroffen.

Aber wenn Sie, sagen wir, <1000 Zeilen, die Sie wirklich nicht kümmern:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top