【发布时间】:2013-03-21 21:04:33
【问题描述】:
我有一个非常大的表,所以我使用以下方法来删除旧条目:
WHILE (@@ROWCOUNT > 0)
BEGIN
DELETE TOP (5000) FROM myTable
WHERE date < 20130103
END
我已经使用不同的日期运行了几次。有时它可以正常工作(大约需要 20 分钟),但有时查询会立即完成并且没有任何内容被删除。发生这种情况时,我只需从该表中执行一个简单的 SELECT 语句,然后再次尝试上面的 WHILE 语句,然后它就可以工作了!有谁知道这是为什么?我需要自动执行此查询以定期运行以控制表大小,但我想确保它在运行时实际正确删除。谢谢。
【问题讨论】:
-
日期不应该写成
'2013-01-03'而不是数字吗? -
有趣的是,每个答案都完全错过了。
-
另外请注意,仅仅有一个循环并不一定会减少对日志或并发的影响,具体取决于这是否是单个事务。我将停止使用@@ROWCOUNT 进行控制,在循环中添加事务,并设置一个变量=@@ROWCOUNT。见sqlperformance.com/2013/03/io-subsystem/chunk-deletes
-
顺便@AndrewMorton,SQL Server 确实理解 '20130103' 与 '2013-01-03' 相同(在使用日期进行布尔逻辑时),但是是的,OP 必须在周围加上引号将其视为日期的数字。让您想知道 OP(以及下面的其他人)如何测试查询,因为当我尝试发布的语法时出现以下错误:“将表达式转换为数据类型日期时间的算术溢出错误”?
-
@AndrewJens Be Wary of Date Formatting in T-SQL 刚刚通过 SQL Server Central 时事通讯引起了我的注意。看起来没有破折号的格式比有破折号的格式更安全。
标签: sql sql-server rowcount