加入收藏 | 设为首页 | 会员中心 | 我要投稿 上饶站长网 (https://www.0793zz.com.cn/)- 数据库平台、视觉智能、智能搜索、决策智能、迁移!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 在Sql Server中,有没有办法检查选定的一组行是否

发布时间:2021-05-24 03:11:22 所属栏目:MsSql教程 来源:网络整理
导读:我们正在尝试更新/删除数十亿行表中的大量记录.由于这是一个受欢迎的表,因此本表的不同部分有很多活动.任何大型更新/删除活动都被阻止了很长一段时间(因为它等待锁定所有行或页锁或表锁)导致超时或需要多天才能完成任务. 因此,我们正在改变删除小批量行的方法

我们正在尝试更新/删除数十亿行表中的大量记录.由于这是一个受欢迎的表,因此本表的不同部分有很多活动.任何大型更新/删除活动都被阻止了很长一段时间(因为它等待锁定所有行或页锁或表锁)导致超时或需要多天才能完成任务.

因此,我们正在改变删除小批量行的方法.但我们想要检查所选的(例如100或1000或2000行)当前是否被其他进程锁定.

>如果没有,则继续删除/更新.
>如果它们被锁定,则转到下一组记录.
>最后,回到开始并尝试更新/删除遗漏的那些.

这可行吗?

谢谢,
的ToC

解决方法

So,we are changing the approach to delete small batch of rows at at time.

这是在small careful batches或chunks中删除的一个非常好的主意.我会添加一个小的waitfor延迟’00:00:05’并且取决于数据库的恢复模型 – 如果已满,则执行日志备份,如果是SIMPLE则执行一个手动CHECKPOINT,以避免事务日志膨胀 – 批次之间.

But we want to check if the selected (let’s say 100 or 1000 or 2000 rows) are currently locked by a different process or not.

你所说的不是完全可能的开箱即用(记住你的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服务器不会读取它.

Specifies that the Database Engine not read rows that are locked by other transactions. When READPAST is specified,row-level locks are skipped. That is,the Database Engine skips past the rows instead of blocking the current transaction until the locks are released.

在我的有限测试期间,当使用带有(READPAST,READCOMMITTEDLOCK)的schema.tableName中的DELETE并使用SET TRANSACTION ISOLATION LEVEL READ COMMITTED将查询会话隔离级别设置为READ COMMITTED时,我发现了非常好的吞吐量,这是默认的隔离级别.

(编辑:上饶站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读