什么是 SQL Server 闩锁争用?
闩锁是 SQL Server 引擎使用的轻量级同步基元,可确保内存中结构(包括索引、数据页)和内部结构(例如 B 树中的非叶页)的一致性。 SQL Server 使用缓冲区闩锁来保护缓冲池中的页,使用 I/O 闩锁来保护尚未载入缓冲池的页。 每当在 SQL Server 缓冲池的页中写入或读取数据时,工作线程都必须先获取该页的缓冲区闩锁。 有多种类型的缓冲区闩锁可用于访问缓冲池中的页,包括独占闩锁 (PAGELATCH_EX) 和共享闩锁 (PAGELATCH_SH)。 如果 SQL Server 尝试访问缓冲池中尚不存在的页,系统会发送一个异步 I/O,将该页加载到缓冲池中。 如果 SQL Server 需要等待 I/O 子系统响应,它会根据请求类型等待独占 (PAGEIOLATCH_EX) 或共享 (PAGEIOLATCH_SH) I/O 闩锁;这样做是为了防止另一个工作线程使用不兼容的闩锁将同一页加载到缓冲池中。 闩锁还用于保护对缓冲池页以外的内部内存结构的访问;这些闩锁称为非缓冲区闩锁。
页闩锁争用是多 CPU 系统上最常见的情况,因此,本文将着重介绍这些内容。
当多个线程同时尝试获取同一内存中结构的不兼容闩锁时,就会发生闩锁争用。 闩锁是一种内部控制机制,因此 SQL 引擎会自动确定何时使用它。 因为闩锁的行为是确定性的,所以应用程序决策(包括架构设计)可以影响此行为。 本文旨在提供以下信息:
- 有关 SQL Server 如何使用闩锁的背景信息。
- 用于调查闩锁争用的工具。
- 如何确定观察到的争用量是否有问题。
我们将讨论一些常见情况,以及如何以最佳方式处理它们,以缓解争用。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




