【问题标题】:Removing rows without transaction logging?在没有事务记录的情况下删除行?
【发布时间】:2015-01-14 12:10:33
【问题描述】:

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

问题是,删除行实际上甚至释放空间,因为数据库有事务日志记录?我可以通过绕过该操作的事务日志来删除行吗?

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

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

有一些特殊情况可以安全地绕过这些事情 - truncate table 将一次删除所有行,并且仅当表没有外键时,这使得它相当微不足道。不过,你不能以任何方式限制它。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2017-05-15
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多