【发布时间】:2021-02-18 18:22:57
【问题描述】:
我有一个非常大的数据库(至少对我来说)- 超过 1 000 000 条记录,我需要删除所有时间戳低于某个值的记录。比如:
DELETE FROM table WHERE TS < 2020-01-01;
我面临的问题是,事务完成后,如果它完成了,数据库是无响应且无法使用的。如果没有上述问题,如何删除这么多记录?
我是新手,到目前为止,我只使用过具有 1000-10000 行的数据库,并且我用来删除记录的命令没有引起问题。
【问题讨论】:
-
无响应和无法使用是什么意思?您是否有机会发出
select * from table或其他扫描大部分表格的东西?这可能表明您正在触发协作垃圾收集,这意味着执行表扫描的事务会产生从删除中清理垃圾的成本。 -
也许你需要一个索引?
-
@Mark Rotterveel 是的,这正是我遇到的问题,或者下一次删除我尝试做的事情。我怎样才能过去呢?我应该先做
DELETE然后备份和恢复,然后再删除并再次备份和恢复? -
@Tony1234 。 . .将要保留的数据存储在新表中通常会更好。然后截断现有表并重新插入数据。
-
@GordonLinoff Firebird 没有 truncate table 语句,因此您需要删除所有记录,这将导致更大版本的问题,因为它会产生更多垃圾来收集。
标签: sql firebird firebird2.5