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无法在指定计划中使用”(这是主键)问题是如何有效清空表?无法删除和重新创建。
根据我的评论回答
您可以尝试使用的一个技巧DELETE FROM SZAFKI WHERE ID > 0
(假设等于ID
或大于1)。这将迫使Firebird使用主键索引查找行。
我最初的假设是,这将比未索引的删除更糟糕。未索引的删除将对表的所有数据页进行顺序扫描并删除行(即:创建一个新的recordversion,它是已删除的存根记录)。当您使用索引时,它将按索引顺序查找行,这将导致随机遍历数据页(假设由于插入,删除和更新导致记录版本繁多,因此数据碎片化程度很高)。我曾预计这会慢一些,但是可能会导致Firebird只读取相关数据页(与事务相关的记录版本),而不是读取表的所有数据页。
归档时间: |
|
查看次数: |
19772 次 |
最近记录: |