Sql server 禁用锁升级是否会给数据mdf带来更多压力?

Sql server 禁用锁升级是否会给数据mdf带来更多压力?,sql-server,sql-server-2012,locking,block,escalation,Sql Server,Sql Server 2012,Locking,Block,Escalation,我们有一个大型多用途应用程序,它在许多表上都有对象和页面块。我们无法重新考虑设计,但需要减少影响客户机性能的块。 我一直在考虑在一个表上禁用锁升级,但需要知道它会给其他资源带来什么压力。磁盘i/o已紧张。额外的单个锁是否需要比自动表锁更多的i/o?它对系统数据库的影响会超过对应用程序数据库的影响吗? 我们不进行完整的表更新/读取。每个请求只处理表中很小的一部分 我们有一个大型多用途应用程序,它受到对象和页面的影响 多个表上的块 磁盘i/o已紧张。 附加的单个锁是否需要比自动锁更多的i/o 桌子

我们有一个大型多用途应用程序,它在许多表上都有对象和页面块。我们无法重新考虑设计,但需要减少影响客户机性能的块。 我一直在考虑在一个表上禁用锁升级,但需要知道它会给其他资源带来什么压力。磁盘i/o已紧张。额外的单个锁是否需要比自动表锁更多的i/o?它对系统数据库的影响会超过对应用程序数据库的影响吗? 我们不进行完整的表更新/读取。每个请求只处理表中很小的一部分

我们有一个大型多用途应用程序,它受到对象和页面的影响 多个表上的块

磁盘i/o已紧张。 附加的单个锁是否需要比自动锁更多的i/o 桌子锁

你误解了锁升级,从你问题中我大胆提出的部分可以清楚地看出这一点

锁升级从行到表,或从页到表,我排除了分区,因为这不是您的情况,所以如果您现在有页锁,它不是锁升级

锁粒度由服务器选择,除非您使用提示rowlock、paglock,并且如果选择页面锁,则不会升级。如果它随后删除所有页面锁并用表锁替换它们,则意味着发生了锁升级

第二个错误是你认为锁与IO有关。事实并非如此。锁保存在内存中,与读取无关。您可以查看本文,了解当锁更细粒度时CPU使用率和查询持续时间是如何增加的:

您应该了解导致锁升级的原因

锁定升级阈值

在上未禁用锁升级时,会触发锁升级 通过使用ALTER table SET LOCK_升级选项创建该表,以及 当存在以下任一情况时:

单个Transact-SQL语句在单个非分区表或索引上至少获取5000个锁。 单个Transact-SQL语句在分区表的单个分区上获取至少5000个锁,并且 ALTER TABLE SET LOCK_升级选项设置为AUTO。 数据库引擎实例中的锁数超过内存或配置阈值。 因此,如果您达到每个语句5000个锁的阈值,您应该将操作拆分为更小的批

如果您面临内存压力,禁用锁升级将使您的情况更加糟糕

更新

我在书中找到了关于锁的描述

锁不在磁盘结构上。您无法直接找到锁定字段 在数据页或表头上,以及跟踪 锁永远不会写入磁盘。锁是内部内存结构: 它们会消耗SQL Server使用的部分内存。锁是锁 由锁资源标识,锁资源是对资源的描述 这将锁定行、索引键、页面或表。跟踪 数据库、锁的类型以及描述锁定的 资源,每个锁在32位系统上需要64字节的内存,并且 64位系统上的128字节内存。这是64字节还是128字节 结构称为锁块。 ... 锁管理器维护一个锁哈希表。锁定资源, 包含在一个锁块中的,进行散列以确定目标散列 哈希表中的插槽。散列到同一插槽的所有锁块都是 从哈希表中的一个条目链接在一起。每个锁块 包含描述锁定资源的15字节字段。锁 块还包含指向锁所有者块列表的指针。每个 这三个州有一个单独的锁所有者名单


希望有帮助。

这里没有人能提供有意义的答案。您没有提供任何详细信息。我想知道,如果有更多的单独锁定请求行,而不是少量的页面/表格,将如何影响系统。锁信息将保存在哪里?可能有1000个行锁会导致资源问题吗?同样,这是非常模糊的,唯一有效的答案是这取决于。您可能会参考跟踪标志1211和1224。你看过文件了吗?Quote:使用此跟踪标志可能会生成过多的锁。这可能会降低数据库引擎的性能,或导致1204个错误。你读了Reduce块了吗。我打算添加锁提示或更改表以禁用锁升级。也许我的描述和理解不清楚。我正在考虑使用提示或ALTERTABLE停止表上的锁升级。你说锁存储在内存中,但如果我有过多的锁,它们不是被写入磁盘吗?它们在任何时候都不会写入系统表吗?我理解
很好,您希望停止某些表上的锁升级。我重复我的答案:首先,你应该考虑锁升级的原因,它可能是内存压力造成的,在这种情况下,当你停止锁升级时,甚至更多的锁会消耗你的内存,你的情况会更糟。第二,我重复一遍,锁与IO和磁盘无关,它们存储在RAM中,它们是内存和CPU消耗。我知道锁升级的原因是因为它是一个使用率很高的系统,具有很高的读取率,而不是内存约束,而且升级始终是到表的。我正在考虑使用锁升级禁用和行提示来停止所有非行锁。我的OQ是在表上强制执行>5000个锁时是否有任何磁盘使用/等待。当我读syslockinfo时,你是说它只映射到内存,它从内存读取。该表在任何时候都不存在于磁盘上。您回答这个问题时说它从未写入磁盘。谢谢。@cloudsafe我用锁结构描述更新了我的答案