sql-server – 在Sql Server中,有没有办法检查选定的一组行是否
我们正在尝试更新/删除数十亿行表中的大量记录.由于这是一个受欢迎的表,因此本表的不同部分有很多活动.任何大型更新/删除活动都被阻止了很长一段时间(因为它等待锁定所有行或页锁或表锁)导致超时或需要多天才能完成任务. 因此,我们正在改变删除小批量行的方法.但我们想要检查所选的(例如100或1000或2000行)当前是否被其他进程锁定. >如果没有,则继续删除/更新. 这可行吗? 谢谢, 解决方法
这是在small careful batches或chunks中删除的一个非常好的主意.我会添加一个小的waitfor延迟’00:00:05’并且取决于数据库的恢复模型 – 如果已满,则执行日志备份,如果是SIMPLE则执行一个手动CHECKPOINT,以避免事务日志膨胀 – 批次之间.
你所说的不是完全可能的开箱即用(记住你的3个要点).如果上述建议 – 小批量等待延迟不起作用(假设您进行了适当的测试),那么您可以使用查询HINT. 不要使用NOLOCK – 请参阅kb/308886,SQL Server Read-Consistency Problems by Itzik Ben-Gan,Putting NOLOCK everywhere – By Aaron Bertrand和SQL Server NOLOCK Hint & other poor ideas. READPAST提示将有助于您的方案. READPAST提示的要点是 – 如果存在行级锁定,则SQL服务器不会读取它.
在我的有限测试期间,当使用带有(READPAST,READCOMMITTEDLOCK)的schema.tableName中的DELETE并使用SET TRANSACTION ISOLATION LEVEL READ COMMITTED将查询会话隔离级别设置为READ COMMITTED时,我发现了非常好的吞吐量,这是默认的隔离级别. (编辑:上饶站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |