LÖSCHEN gesamte Tabelle mit Ausnahme der für eine Zeile

Angenommen ich habe eine Datenbank mit einer Tabelle, die enthält 200k+ Zeilen.

Diese Tabelle hat eine Feste Tupel mit der id 1800. Der rest der Tupel-Sequenz beginnt bei 300k+.

Ich habe einen Bedarf zu reinigen Sie diese Tabelle, löschen Sie alle Datensätze, ohne zu löschen die man registrieren mit id-1800. Ich kam mit 3 Arten Abfrage, die ich könnte möglicherweise run:

DELETE FROM table WHERE id > 1800
DELETE FROM table WHERE id <> 1800
DELETE FROM table WHERE id NOT IN (1800)

Habe ich das Gefühl, dass der erste, ist schneller als die anderen, aber ich bin mir nicht sicher, wie alle anderen Daten-ids Weise größer als 1800.

Welcher von beiden ist schneller und warum? Auch, wenn es ist ein schneller Weg, um die Datensätze löschen außer die, die nicht gelöscht werden kann, lassen Sie es mich wissen.

Am schnellsten wird es wahrscheinlich sein, kopieren Sie die in einem Datensatz, die Sie wollen in eine temp-Tabelle, abschneiden der Tabelle, dann fügen Sie die in einem Datensatz zurück
Es sei denn, die Abfrage-Optimierer total Scheiße ist (was sehr unwahrscheinlich ist), die drei sind genau die gleichen.
Es hängt davon ab. Wenn id ein (primär -) Schlüssel (oder einem indizierten Feld) die drei Abfragen haben eine vergleichbare Leistung. Sonst : geht alles, je nach Indizes und der Kardinalität der id-Domäne.
Sie können daran interessiert sein, die eng mit Antworten hier und hier.
Gibt es irgendwelche Fremdschlüssel beteiligt? Wenn dem so ist, könnte große Auswirkungen auf die performance. Trotzdem, der Datensatz kopieren aus und abgeschnitten werden könnte, wenn es keine Fremdschlüssel. Wenn es Fremdschlüssel löschen Sie alle anderen Zeilen ist der Weg zu gehen, leider, wie es ist ziemlich langsam. Auch wenn es FKs dann stellen Sie sicher, dass Sie Indizes an der referncing Zeilen.

InformationsquelleAutor MurifoX | 2013-01-16

Schreibe einen Kommentar