在没有事务日志记录的情况下删除行?

Removing rows without transaction logging?

我们有相当大的 table,有数亿行。 运行 删除特定外键值的行大约需要 5-15 分钟。例如删除 800 万行需要 15 分钟。

问题是删除行实际上是否释放了 space 因为数据库有事务日志记录?我可以删除绕过该操作的事务日志记录的行吗?

简单来说,您无法绕过事务日志记录。这正是数据库确保一致性的方式——如果事务中途失败(或者服务器电源故障,例如),数据库引擎需要知道如何再次进入一致状态。此外,将要更改的内容附加到事务日志中比实际对数据库的数据文件执行更改要快得多,尤其是在像你这样的情况下。

有一些特殊情况可以安全地绕过这些事情 - truncate table 将立即删除所有行,并且仅当 table 没有外键时,这使得它相当琐碎的。但是,您不能以任何方式限制它。

新释放的 space 将作为数据库维护周期的一部分被回收。在每次数据库备份期间,数据库被同步以将所有数据写入数据文件,并且事务日志被备份并在数据库本身中清空(我过于简单化,因为有很多可能的配置 - 在任何情况下,这是您的 DBA 应该关心的事情)。

如果这给您带来了问题,解决方案无论如何都不会绕过事务日志记录。您可能想问一次为什么(以及多久)需要删除数百万行。