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

Schreibe einen Kommentar