Firebird截断表/删除所有行

Kit*_*tet 4 sql firebird truncate sql-delete

我正在使用Firebird 2.5.1 Embedded。我已经按照通常的方法清空了近200k行的表:

delete from SZAFKI
Run Code Online (Sandbox Code Playgroud)

这是输出,需要16秒,这是不可接受的。

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.
Run Code Online (Sandbox Code Playgroud)

Firebird没有TRUNCATE关键字。当查询使用PLAN NATURAL时,我尝试手动进行查询计划,如下所示:

delete from szafki PLAN (SZAFKI INDEX (SZAFKI_PK))
Run Code Online (Sandbox Code Playgroud)

但是Firebird说“ SZAFKI_PK无法在指定计划中使用”(这是主键)问题是如何有效清空表?无法删除和重新创建。

Mar*_*eel 7

根据我的评论回答

您可以尝试使用的一个技巧DELETE FROM SZAFKI WHERE ID > 0(假设等于ID或大于1)。这将迫使Firebird使用主键索引查找行。

我最初的假设是,这将比未索引的删除更糟糕。未索引的删除将对表的所有数据页进行顺序扫描并删除行(即:创建一个新的recordversion,它是已删除的存根记录)。当您使用索引时,它将按索引顺序查找行,这将导致随机遍历数据页(假设由于插入,删除和更新导致记录版本繁多,因此数据碎片化程度很高)。我曾预计这会慢一些,但是可能会导致Firebird只读取相关数据页(与事务相关的记录版本),而不是读取表的所有数据页。