使用 SQL Server 2005。
我正在执行一个没有 where 子句的巨大 DELETE FROM。它基本上等同于 TRUNCATE TABLE 语句——除了我不允许使用 TRUNCATE。问题是表很大——有 1000 万行,需要一个多小时才能完成。有没有办法让它更快,没有:
- 使用截断
- 禁用或删除索引?
t-log 已经在单独的磁盘上。
欢迎任何建议!
使用 SQL Server 2005。
我正在执行一个没有 where 子句的巨大 DELETE FROM。它基本上等同于 TRUNCATE TABLE 语句——除了我不允许使用 TRUNCATE。问题是表很大——有 1000 万行,需要一个多小时才能完成。有没有办法让它更快,没有:
t-log 已经在单独的磁盘上。
欢迎任何建议!
你可以做的是这样的批量删除:
例如,xxx 是 50000
对此的修改,如果您想删除非常高百分比的行...
您可以使用 TOP 子句轻松完成此操作:
如果您无法使用 TRUNCATE,我同意将您的删除批处理成可管理块的建议,并且我喜欢 drop/create 建议的独创性,但我对您问题中的以下评论感到好奇:
我猜这个限制的原因与需要授予直接截断表的安全性有关,并且它允许您截断您所关心的表以外的表。
假设是这种情况,我想知道创建一个使用 TRUNCATE TABLE 并使用“EXECUTE AS”的存储过程是否被认为是提供直接截断表所需的安全权限的可行替代方案。
希望这将为您提供所需的速度,同时解决您的公司在将您的帐户添加到 db_ddladmin 角色时可能遇到的安全问题。
以这种方式使用存储过程的另一个优点是存储过程本身可以被锁定,以便只允许特定帐户使用它。
如果由于某种原因这不是一个可接受的解决方案,并且您需要删除此表中的数据是需要每天/每小时/等执行一次的事情,我会要求创建一个 SQL 代理作业来截断表在每天的预定时间。
希望这可以帮助!
除了截断..只有批量删除可以帮助你。
当然,您可以删除该表并使用所有约束和索引重新创建它。在 Management Studio 中,您可以选择编写要删除和创建的表的脚本,因此它应该是一个简单的选项。但这只有在您被允许执行 DDL 操作时才这样做,我认为这不是一个真正的选择。
由于这个问题是如此重要的参考,我发布了这段代码,它真正帮助我理解了循环删除以及循环内的消息传递以跟踪进度。
查询是根据这个重复的问题修改的。感谢@RLF查询库。