对SQL语句中要删除的行数应该有什么限制?
我们需要删除1到数十万行,并且需要应用某种最佳实践限制,以便在每次清空废纸篓时都不会完全杀死SQL服务器或填满日志.
此问题并非特定于任何类型的数据库.
解决方法
这是一个非常广泛的问题,基本上归结为“它取决于”.影响它的因素包括:
>您的并发级别是多少? 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 ...]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。