删除没有事务记录的行?

时间:2015-01-14 12:10:33

标签: sql sql-server-2008

我们拥有数十亿行的大桌子。为特定的外键值运行删除行大约需要5-15分钟。例如,删除800万行需要15分钟。

问题是,当数据库有事务登录时,删除行实际上是否释放了空间?我是否可以删除具有该操作的旁路事务日志记录的行?

1 个答案:

答案 0 :(得分:1)

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

有一些特殊情况可以安全地解决这些问题 - truncate table会立即删除所有行,并且只有在表没有外键时才会这样做,这使得它变得相当简单。但是,你不能以任何方式限制它。

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

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