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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Schnellste Weg, in den meisten Datenbanken wäre:
Zugegeben, dies kann nicht möglich sein, aufgrund von Triggern, Einschränkungen und Berechtigungen. In vielen Datenbanken können Sie etwas ähnliches tun, indem geändert wird, (2) zum abschneiden der Tabelle, statt ihn zu löschen.
Als für Ihre ursprüngliche Frage, ist der Aufwand tatsächlich mit dem löschen der Zeilen und die Daten mit Ihnen verknüpft ist, dominiert Sie die Abfrage. Wie Sie das tun, der Vergleich ist irrelevant.
Beispielcode
Ich bin mir nicht sicher über Postgres Namenskonventionen für temporäre Tabellen, aber das ist die Idee.
Dies ist zwar schnell, Sie tut es mit DDL-Anweisungen anstelle von DML-Anweisungen, die können verheerend sein, wenn Sie sich mit der inter-Tabelle von Abhängigkeiten. Ich wäre für das hinzufügen eines index auf
id
(wenn es nicht schon dort befindet) und dabei diedelete
wenn Sie wollten, sicherer Daten-Konsistenz; weil, ausführen, löschen, müssen Sie zuerst die Datensätze (also ein index beschleunigt das Teil von der Bedienung). Allerdings, wenn die raw-Geschwindigkeit ist Ihre einzige Sorge, dies ist wahrscheinlich der Schnellste Weg zu gehen.Abschneiden ist immer besser als löschen und Neuerstellen einer Tabelle. Was ist, wenn es ausländische keys etc? Viel einfacher zu kürzen, und nur so schnell, wie durch das löschen und Neuerstellen der Tabelle. (wenn nicht schneller)
InformationsquelleAutor Gordon Linoff
Solange diese betreffen dieselben Datensätze, diese haben ähnliche Leistung.
Gibt es eine geringe chance, den ehemaligen verwenden einen index suchen, statt als effizienter full table scan, aber es ist vernachlässigbar.
InformationsquelleAutor Quassnoi
Wenn Sie sich nicht bewegen Sie die ID in eine neue Tabelle, möchten Sie vielleicht zu versuchen und zu löschen, in Gruppen oder Chargen. Manchmal ist eine Transaktion mit einem großen Teil der Datensätze, die nicht verarbeitet wurden die schnellsten. Dies ist der Fall für jede Datenbank, oracle-und microsoft-Datenbank-Produkte enthalten.
InformationsquelleAutor Kuberchaun