【问题标题】:Does disabling lock escalation put more stress on the data mdf?禁用锁升级是否会给数据 mdf 带来更多压力?
【发布时间】:2018-01-23 16:22:01
【问题描述】:

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

【问题讨论】:

  • 这里没有任何人可以提供有意义的答案。您尚未提供任何详细信息。
  • 我想知道有更多的个人锁定请求(行而不是少量的页面/表)将如何影响系统。锁信息将保存在哪里?可能有一千行锁会导致资源问题?
  • 再次......这非常模糊,唯一有效的答案是“它取决于”。
  • 大概您参考了跟踪标志 1211 和 1224。您是否阅读了文档? Quote: 使用这个跟踪标志会产生过多的锁。这可能会降低数据库引擎的性能,或导致 1204 错误。你读过“减少阻塞”info.
  • 没有。我打算添加锁定提示或 ALTER TABLE 以禁用锁定升级。

标签: sql-server sql-server-2012 locking block escalation


【解决方案1】:

我们有一个遭受 OBJECT 和 PAGE 困扰的大型多用途应用程序 在许多表上的块。

...

磁盘 i/o 已经紧张。 额外的、单独的锁是否需要比自动锁更多的 i/o 表锁?

你误解了锁升级,这从你问题中我加粗的部分很明显。

锁升级是from rows to tablefrom pages to table(我排除了分区,因为它不是你的情况),所以如果你现在有页面锁,那就是不锁升级

除非您使用提示(rowlockpaglock),否则服务器会选择锁定粒度,并且如果它选择了page locks,则不会升级。如果它然后删除所有page locks 并用table lock 替换它们,这意味着lock escalation 发生了。

第二个错误是你认为锁与IO 有关。这不是真的。锁保存在内存中,与读取无关。您可以查看这篇文章,了解当锁定更细化时CPU usagequery duration 如何增加:Why ROWLOCK Hints Can Make Queries Slower and Blocking Worse in SQL Server

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

锁定升级阈值

当锁升级未被禁用时触发锁升级 使用ALTER TABLE SET LOCK_ESCALATION 选项的表格,以及 当下列任一情况存在时:

  • 单个 Transact-SQL 语句在单个非分区表或索引上获取至少 5,000 个锁。
  • 单个 Transact-SQL 语句在分区表的单个分区上获取至少 5,000 个锁,并且 ALTER TABLE SET LOCK_ESCALATION 选项设置为 AUTO。
  • 数据库引擎实例中的锁数超过内存或配置阈值。

Lock Escalation (Database Engine)

因此,如果每个语句的阈值达到 5,000 个锁,则应将操作拆分为更小的批次。

如果您处于内存压力之下,禁用锁升级将使您的情况变得更糟。

更新

我在Microsoft SQL Server 2012 Internals (Developer Reference)by Kalen Delaney (Author),‎ Bob Beauchemin (Author),‎ Conor Cunningham (Author),‎ Jonathan Kehayias (Author),‎ Paul S. Randal (Author),‎ Benjamin Nevarez (Author这本书里找到了关于锁的描述

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

希望对你有帮助。

【讨论】:

  • 可能我的描述和理解不够清楚。我正在考虑使用提示或 ALTER 表停止表上的锁升级。你说锁是存储在内存中的,但是如果我有过多的锁,它们不是写到磁盘吗?它们在任何时候都不会写入系统表吗?
  • 我完全理解你,你想停止某些表的锁升级。我重复我的回答:首先你应该考虑你的锁升级的原因,它可能是内存压力引起的,在这种情况下,当你停止锁升级时,即使更多的锁也会消耗你的内存,你的情况会更糟。其次,我再说一遍,锁与IO和磁盘无关,它们存储在RAM中,它们是内存和CPU消耗的
  • 我知道锁升级的原因是由于它是一个使用非常频繁的系统,具有非常高的读取,而不是内存限制,并且升级总是针对表。我正在考虑使用 lock_escalation DISABLE 和 rowhints 来停止所有非行锁。我的 OQ 是在表上强制 > 5000 个锁时是否有任何磁盘使用/等待。当我阅读 syslockinfo 时,您是说这仅映射到内存并从内存中读取。该表在任何时候都没有物理存在于磁盘上。您已经回答了这个问题,说它永远不会写入磁盘。谢谢。
  • @cloudsafe 我用锁结构描述更新了我的答案
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2018-10-28
  • 2011-01-21
  • 2020-12-31
  • 1970-01-01
  • 2012-09-06
  • 2018-10-29
相关资源
最近更新 更多