gpt4 book ai didi

sql - Firebird 截断表/删除所有行

转载 作者:行者123 更新时间:2023-12-03 19:59:24 30 4
gpt4 key购买 nike

我正在使用 Firebird 2.5.1 Embedded。我已经按照惯例清空了将近 20 万行的表格:

delete from SZAFKI

这是输出,看看它需要 16 秒,这是 Not Acceptable 。
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 不能在指定的计划中使用”(它是一个主键)
问题是我如何有效地清空 table ?删除和重新创建是不可能的。

最佳答案

根据我的评论回答

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

我最初的假设是这会比未编入索引的删除更糟糕。无索引删除将对表的所有数据页进行顺序扫描并删除行(即:创建一个新的记录版本,该记录版本是已删除的 stub 记录)。当您使用索引时,它将按索引顺序查找行,这将导致随机遍历数据页(假设由于插入、删除和更新导致的大量记录版本而导致数据中的高度碎片化)。我原以为这会更慢,但可能会导致 Firebird 只读取相关数据页(具有与事务相关的记录版本)而不是表的所有数据页。

关于sql - Firebird 截断表/删除所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13818194/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com