【发布时间】:2012-12-11 10:23:38
【问题描述】:
我使用的是 Firebird 2.5.1 Embedded。我已经按照惯例清空了将近 200k 行的表:
delete from SZAFKI
这是输出,看它需要 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.
Firebird 没有 TRUNCATE 关键字。由于查询使用 PLAN NATURAL,我尝试手动计划查询,如下所示:
delete from szafki PLAN (SZAFKI INDEX (SZAFKI_PK))
但是 Firebird 说“SZAFKI_PK 不能在指定的计划中使用”(它是一个主键) 问题是我如何有效地清空表格?无法删除和重新创建。
【问题讨论】:
-
“无法删除和重新创建。”为什么不呢?
-
您是否有针对指定表的 ON DELETE 触发器?
-
删除约束(PK 和 FK)然后删除数据,然后重新创建约束。
-
计划在没有
WHERE条件的情况下对删除没有用处:无论如何它都需要扫描整个表,并且由于Firebird中数据的方向,遵循索引顺序甚至会受到伤害,因为它将随机遍历表的所有页面,而不是按存储顺序扫描表的页面。 -
要尝试的另一件事是
DELETE FROM SZAFKI WHERE ID > 0(假设 id 为 1 或更高)。顺便说一句,这是一张在最终删除之前更新、删除和插入行的表吗?当我在具有 200K 记录的表上删除时(新填充,因此没有垃圾,也没有数据页碎片),它在 1.5 秒内完成。
标签: sql firebird sql-delete truncate