SQL DELETE - 最大行数

Rum*_*ser 7 sql sql-server max sql-delete

对SQL语句中要删除的行数应该有什么限制?

我们需要删除1到数十万行,并且需要应用某种最佳实践限制,以便在每次清空废纸篓时都不会完全杀死SQL服务器或填满日志.

此问题并非特定于任何类型的数据库.

jkl*_*ack 12

这是一个非常广泛的问题,基本上归结为"它取决于".影响它的因素包括:

  • 你的并发水平是多少?delete语句对受影响的行放置独占锁.取决于数据库引擎,已删除的数据分布等,可能会升级到页面或整个表.您的数据阅读器是否可以在删除期间被阻止?

  • 删除语句有多复杂?您加入了多少个其他表,或者是否有复杂的WHERE子句?有时,删除行的标识可能比删除本身更"昂贵",因此一个大删除可能"更便宜".

  • 你害怕死锁吗?当您减小删除的大小时,您的死锁"足迹"会减少.理想情况下,单行删除将始终成功.

  • 您是否关心吞吐量性能?与任何SQL语句一样,通常有一定量的开销(连接内容,查询解析,返回结果等).从单连接的角度来看,1000行删除将比1000 x 1行删除更快.

  • 不要忘记索引维护开销,碎片清理或任何触发器.它们也会影响您的系统.

但总的来说,我的每个语句的基线为1000行.我使用过的大多数系统(子"企业")最终都有每个删除500到5000个记录的甜点.我喜欢做这样的事情:

set rowcount 500

select 1    -- Just to force @@rowcount > 0
while @@ROWCOUNT > 0
delete from [table]
     [where ...]
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的读者,请参阅下面 @SQLPhil 的回答。根据 Microsoft 联机丛书,未来版本的 SQL Server 将不会支持“INSERT”、“UPDATE”或“DELETE”语句的“SET ROWCOUNT”。最好使用“TOP”语法。 (2认同)
  • 最好将此类信息放在答案的顶部,而不是@jklemmack,其中包含您的答案适用的版本号以及适用于未来版本的答案的链接。 (2认同)

小智 5

虽然使用 set rowcount 选项限制删除影响的行数,然后执行循环非常好(我之前已经使用过很多次),但请注意,从 SQL 2012 开始,这将不再是一个选项(参见玻尔)。

因此,另一个选择可能是使用 TOP 子句限制删除的行数。IE

SELECT 1

WHILE @@ROWCOUNT > 0
BEGIN
    DELETE TOP (#)
    FROM mytable
    [WHERE ...]
END
Run Code Online (Sandbox Code Playgroud)