应该对SQL语句中要删除的行数设置什么限制?
我们需要删除1到几十万行,并需要应用某种最佳实践限制,以便不会在每次清空废纸篓时完全杀死SQL server或填满日志。
这个问题并不特定于任何类型的数据库。
发布于 2011-12-30 05:07:52
这是一个非常广泛的问题,基本上可以归结为“视情况而定”。影响它的因素包括:
不过,一般来说,我的基准测试是每条语句1000行。我使用过的大多数系统(子“企业”)在每次删除500到5000条记录时都会达到最佳状态。我喜欢这样做:
set rowcount 500
select 1 -- Just to force @@rowcount > 0
while @@ROWCOUNT > 0
delete from [table]
[where ...]发布于 2012-01-04 18:23:55
虽然使用set rowcount选项限制受delete影响的行数,然后执行循环是非常好的(我以前使用过很多次),但请注意,从SQL2012开始,这将不再是一个选项(请参阅BOL)。
因此,另一种选择可能是使用TOP子句限制要删除的行数。即
SELECT 1
WHILE @@ROWCOUNT > 0
BEGIN
DELETE TOP (#)
FROM mytable
[WHERE ...]
END发布于 2011-12-30 05:02:37
除非您有很多触发器或完整性约束要验证,否则删除操作应该不会那么昂贵。
但是,如果您非常关心性能,我最初的预感是将适当的行标记为已删除,然后在以后的定期清理过程中将其物理删除。但我对此并不感兴趣,因为您必须更改该表上的任何查询,以排除逻辑上删除的行,而不是物理上删除的行。
https://stackoverflow.com/questions/8673349
复制相似问题