Firebird truncate table / löschen aller Zeilen
Ich bin mit Firebird 2.5.1 Embedded. Ich habe getan, die üblichen, leeren die Tabelle mit fast 200k Zeilen:
delete from SZAFKI
Hier ist die Ausgabe, zu sehen, wie es dauert 16 Sekunden, das ist inakzeptabel.
Preparing query: delete from SZAFKI
Prepare time: 0.010s
PLAN (SZAFKI NATURAL)
Executing...
Done.
3973416 fetches, 1030917 marks, 116515 reads, 116434 writes.
0 inserts, 0 updates, 182658 deletes, 27 index, 182658 seq.
Delta memory: -19688 bytes.
SZAFKI: 182658 deletes.
182658 rows affected directly.
Total execution time: 16.729s
Script execution finished.
Firebird hat keine TRUNCATE-Schlüsselwort. Wie verwendet die Abfrage-PLAN, NATÜRLICH, ich habe versucht zu PLANEN, die Abfrage von hand, etwa so:
delete from szafki PLAN (SZAFKI INDEX (SZAFKI_PK))
aber Firebird sagt "SZAFKI_PK kann nicht verwendet werden, die in der angegebenen plan" (Primärschlüssel)
Die Frage ist, wie kann ich leere Tabelle effizient? Löschen und Neuerstellen ist nicht möglich.
"Löschen und neu zu erstellen ist nicht möglich." Warum nicht?
Haben Sie, löst Sie AUF LÖSCHEN für eine bestimmte Tabelle?
Drop-constraints (PK und FK), dann Daten löschen, dann neu erstellen-Einschränkungen.
Plan ist nicht nützlich für die Löschung ohne eine
Eine andere Sache zu versuchen wäre
Haben Sie, löst Sie AUF LÖSCHEN für eine bestimmte Tabelle?
Drop-constraints (PK und FK), dann Daten löschen, dann neu erstellen-Einschränkungen.
Plan ist nicht nützlich für die Löschung ohne eine
WHERE
Bedingung: es müssen zum Scannen der gesamten Tabelle sowieso, und wegen der Ausrichtung der Daten in Firebird, nach der Reihenfolge des index wird einmal weh, weil es ein random-walk durch alle Seiten einer Tabelle, statt Scannen die Seiten einer Tabelle im Speicher um.Eine andere Sache zu versuchen wäre
DELETE FROM SZAFKI WHERE ID > 0
(vorausgesetzt, die ids sind 1 oder höher). Ist das BTW eine Tabelle, in der Zeilen aktualisiert, gelöscht und eingefügt eine Menge vor dem endgültigen löschen; beim löschen auf eine Tabelle mit 200 Datensätzen (frisch gefüllt, so dass kein Müll und keine Fragmentierung der datapages), es führt innerhalb von 1,5 Sekunden.InformationsquelleAutor Kitet | 2012-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf meinen Kommentar
Einen trick, den Sie versuchen könnten, ist die Verwendung
DELETE FROM SZAFKI WHERE ID > 0
(vorausgesetzt, dieID
1 oder höher). Dadurch wird erzwungen, Firebird, um die Zeilen mit Hilfe der primary key-index.Meine erste Vermutung war, dass dies wäre schlimmer als ein nicht indizierter löschen. Ein nicht indizierter löschen wird eine sequenzielle Scannen aller datapages einer Tabelle und löschen von Zeilen (das ist: erstellen Sie eine neue recordversion, dass eine gelöschte stub-Datensatz). Wenn Sie den index es wird die lookup-Zeilen in der Reihenfolge des index, dies wird in einem random-walk durch die datapages (ausgehend von einem hohen Niveau der Fragmentierung der Daten aufgrund einer hohen Anzahl von Datensatz-Versionen aufgrund von Einfügungen, Löschungen und Aktualisierungen). Ich hatte erwartet, dass dieser langsamer sein, aber wahrscheinlich wird es Ergebnis in Firebird zu müssen, nur Lesen Sie die entsprechenden datapages (mit Datensatz-Versionen relevant für die Transaktion), statt alle datapages einer Tabelle.
Die Begehung selbst wird nicht lange dauern, aber der nächste select auf die Tabelle könnte trigger garbage collection (eigentlich das entfernen von alten Datensatz-Versionen, die nicht mehr von Interesse für jede Transaktion), und das könnte ein performance-hit.
es dauerte sehr lange für ein 2M Zeilen der Tabelle...
InformationsquelleAutor Mark Rotteveel
Leider gibt es keine schnellen Weg, um massiven löschen über die gesamte (große) Tabelle, die mit derzeit Firebird-Versionen. Sie können erwarten, dass noch höhere Verzögerungen, wenn der "gelöschte Inhalte" ist die garbage Collection (ausführen wählen Sie * in der Tabelle nach dem löschen ist verpflichtet und Sie werden sehen). Sie können versuchen, deaktivieren Indizes in dieser Tabelle, bevor Sie das löschen und sehen ob es hilft.
Wenn Sie die Tabelle als eine Art Zwischenlagerung, ich schlage vor, Sie verwenden die GTT-Funktion.
InformationsquelleAutor WarmBooter
Schnellste - und nur so-dot loswerden von alle Daten schnell in FireBird-Tabelle- drop und erstellen Tabelle wieder. Zumindest für die aktuelle offizielle version 2.5.X . Es gibt keine truncate-Betreiber in der roadmap für FireBird 3.0 beta raus ist, so dass die meisten wohl kein abschneiden in der 3.0 auch.
Können Sie auch den operator NEU - gleiche syntax wie create. Wenn eine Tabelle vorhanden ist, RECRATE fällt es, dann schafft neue. Wenn die Tabelle nicht existiert, dann neu erstellt nur es.
InformationsquelleAutor TPAKTOPA