SQL Server 闩锁是一种特殊类型的低级别系统锁。在 SQL Server 中,内部闩锁体系结构在 SQL 操作期间保护内存。它确保内存结构与页面读写操作一致性。

SQL Server 闩锁是一种内部的 SQL Server 机制,用于保护共享内存资源,比如缓冲池中的页面和内存数据结构,以便协调对这些资源的访问并保护它们免受破坏。闩锁不会暴露在 SQL Server 操作系统(SQLOS)之外,闩锁只能由SQL Server 自己管理,而不能由用户管理(与可以通过 NOLOCK 提示管理的锁不同)。每当 SQL Server 读取内存时,它都会对无法以适当多线程方式访问的页面或内部内存结构施加闩锁。这样SQL Server就创建了闩锁,为 SQL Server 数据库中多个物理线程协调执行的资源。与我们常用的锁一样,闩锁也有不同的模式。

闩锁模式

Destroy Latch (DT): 最严格的闩锁模式,当一个闩锁被销毁并从缓存中移除一个缓冲区时获得。DT闩锁甚至堵塞KP闩锁。

Exclusive Latch (EX): 获得正在写入的页面的独占控制权。防止在EX闩锁所在页上获取所有其他闩锁。

Update Latch (UP): 类似于排他闩锁的限制性闩锁,但它允许读操作访问页面,但显式地限制任何写操作。

Keep Latch (KP): 用于保存闩锁顺序记录,但也确保它在放置新闩锁时留在缓冲区中。

Shared Latch (SH): 当向页面发出读取请求被授予时在页面上的闩锁。

与锁类似,各种闩锁模式之间也存在兼容性或不兼容性。下表提供了对各种 SQL Server 闩锁器之间兼容性的深入了解

有许多不同类型的 SQL Server 闩锁,但基本上它们可以分为三大类:I/O 闩锁、缓冲区闩锁和非缓冲区闩锁。

I/O 闩锁(I/O latches)

当在缓冲池中存储的页面上执行未完成的 I/O 操作时,或更准确地说,当数据读取或写入到物理存储时,将获取 I/O 闩锁。当 SQL Server 出现等待 I/O 闩锁被释放的时候,SQL Server 将使用 PAGEIOLATCH_XX 等待类型来报告该进程。

因此,当请求将页面从存储写入到缓冲时,在该页面上则获取 PAGEIOLATCH。如果存储未准备好读取,则 PAGEIOLATCH 等待类型计数将增加。

缓冲区闩锁(Buffer latches)

为了正确理解缓冲区闩锁,理解内存缓冲池背后的思想很重要,它是围绕最大化 SQL Server 性能的目标而设计的。缓冲池是一个物理内存范围,从磁盘读取的数据存储在内存数据页中。SQL Server 表中的数据以页为单位存储的,每个页的大小固定为 8192 字节 (8 KB)。每当必须读取或写入数据页时,它将数据放入缓冲池。这样,对该页的任何进一步访问都将直接从内存缓冲池中读取,从而减少磁盘 IO 来提高 SQL Server 性能。

SQL Server 中内存池概念可以是导致物理内存使用率高的原因,即使没有 SQL Server 活动的情况下也是一样。缓冲池中的数据加载基于先进先出 (FIFO) 原则。

SQL Server 使用缓冲区管理器来管理缓冲池。SQLOS 正在通过缓冲区管理器专门访问存储在内存中的数据。(可通过DMV查询 sys.dm_os_memory_clerks)

由于执行DML命令而在缓冲池中修改的页面称为“脏”页面,而未修改的页面称为“干净”页面。因此,当在内存中访问页面时,SQLOS 将获取该页面上的缓冲区闩锁。与锁不同的是,SQL Server 闩锁不会在事务持续期间被持有,而是在事务的关键时期被持有,一旦不再需要它就会被释放。当 SQL Server 出现等待缓冲区闩锁被释放的时候,SQL Server 将使用 PAGELATCH_XX 等待类型来报告该进程。

非缓冲区闩锁(Non-buffer latches)

非缓冲闩锁旨在保护和保证缓冲池中存储的页面以外的任何物理内存结构。当 SQL Server 出现等待缓冲区闩锁被释放的时候,SQL Server 将使用 LATCH_XX 等待类型来报告该进程。在此期间不经常遇到非缓冲区闩锁,因此这些是最少记录的,但是这里有一些用非缓冲闩锁可能导致SQL Server竞争的示例:

  • 过多的并行。在具有 12 个逻辑处理器以上的服务器中使用高度并行的情况下,大多数查询都可以使用并行执行计划。在这种情况下,将在内存中获取非缓冲闩锁(LATCH_XX)以确保并行执行计划使用的内部内存结构的同步。

  • 过多的自动增长/自动收缩操作。在数据库大小或存储容量规划不佳的系统中,自动增长操作频繁执行。另外,当开启自动收缩时,会出现频繁的数据库收缩。在执行增长和收缩操作时,SQL Server 获取 FCB、FGCB_ADD_REMOVE 和 FGCB_ALLOC 这类闩锁,以确保对文件控制块的访问,并确保对存储在文件组中的信息同步访问。

  • 堆和 BLOB 数据结构上的频繁运行 DML 操作。在对堆和 BLOB 数据执行过多 DML 操作的情况下,有必要确保所有内部内存结构负责分配和释放页面同步到堆。在这种情况下,可能会遇到过多的 LATCH_EX 等待类型。在这种情况下,通过 sys.dm_os_latch_stats 可以找到 ALLOC_CREATE_FREESPACE_CACHE、ALLOC_FREESPACE_CACHE、ALLOC_EXTENT_CACHE 等待类型。

因此,当 LATCH_XX 等待类型出现过多值,最好使用以下查询检查 SQL Server 中普遍存在哪些非缓冲区闩锁

SELECT latch_class, wait_time_ms,waiting_requests_count, 100.0 * wait_time_ms / SUM (wait_time_ms) OVER() AS '% of latches'FROM sys.dm_os_latch_statsWHERE latch_class NOT IN ('BUFFER')AND wait_time_ms > 0

闩锁争用对于拥有大量 CPU 的系统来说是一种常见的情况,它在相同的内存结构上,多个线程同时尝试获取彼此不兼容的 SQL Server 闩锁的结果。由于 SQL Server 闩锁是由 SQL Server 内部机制控制的,所以 SQLOS 将自己决定何时使用它们。

在为大量 CPU 的设计的高吞吐量系统,由于经常使用闩锁访问和保护内存结构,因此预计会出现高并发、活动闩锁争用。但是当闩锁争用和闩锁等待类型等待时间大到足以降低 CPU 利用率时,将会导致吞吐量降低。因此,识别和识别闩锁争用的迹象是很重要的。

SQL Server Latches(闩锁)相关推荐

  1. sql server行级锁,排它锁,共享锁的使用

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新  A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...

  2. SQL Server中的锁类型及用法(转载)

    一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新  A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读  ...

  3. SQL Server中的锁的简单学习

    原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但 ...

  4. 理解SQL Server中的锁

    参考文献: T-SQL查询进阶-理解SQL Server中的锁 转载于:https://www.cnblogs.com/xwdreamer/archive/2012/08/19/2646363.htm ...

  5. SQL Server阻塞与锁

    在讨论阻塞与加锁之前,需要先理解一些核心概念:并发性.事务.隔离级别.阻塞锁及死锁. 并发性是指多个进程在相同时间访问或者更改共享数据的能力.一般情况而言,一个系统在互不干扰的情况下可以激活的并发用户 ...

  6. sql server 数据库查锁、解锁

    开发中遇到表查询时第一次查询很快,执行了删除数据后,表查询就一直查不出数据超时异常,后面想到可能是被锁了,然后通过 sql server数据库查锁.解锁 语句解决,在此记录一下: 数据库--查询锁 s ...

  7. SQL Server中的锁

    SQL SERVER的锁机制 官网地址:https://msdn.microsoft.com/zh-cn/library/ms175519(v=sql.105).aspx SQL SERVER的锁机制 ...

  8. SQL Server数据库系列——锁和并发

    最近在使用数据库,综合各方面原因,选择了SQL Server2008.为了对使用的工具有更加深入的了解,所以仔细地阅读了经典翻译书籍<SQL Server 2008高级程序设计>,在此将读 ...

  9. SQL Server Lock Escalation - 锁升级

    Articles Locking in Microsoft SQL Server (Part 12 – Lock Escalation) http://dba.stackexchange.com/qu ...

最新文章

  1. org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar
  2. (转)Linux下C++开发初探
  3. 关于pipeline
  4. 傅里叶变换表_Numpy库小抄表!主要语法和代码都在这里啦
  5. bluecam连接步骤说明_厂家详解旋片式真空泵使用说明
  6. 2005/7/15[随便写写]
  7. mfc怎么改按钮的按下状态_【荐读】马桶上一大一小的按钮该怎么按?原来这些年都错了...
  8. MyCat分布式数据库集群架构工作笔记0016---高可用_单表存储千万级_海量存储_垂直分库划分原则
  9. 今日头条反省整改;微信QQ封杀短视频;雷军10亿赌约将见分晓| CSDN极客头条
  10. java多对多_Java多对多关系示例
  11. 习惯养成android软件,7款好用的习惯养成与打卡APP推荐
  12. stm8s stvd 编译出错
  13. 第二章节:期货市场组织结构与投资者
  14. css特效一:文字覆盖图像悬停效果
  15. ROC-RK3328-CC板子编译烧录环境记录
  16. Deepin搭建Qt5开发环境
  17. 【操作系统】操作系统的功能管理与分类
  18. Greenplum查看表/库大小、进程、表膨胀处理(sql语句)
  19. 泰山OFFICE技术讲座:全网首发:中文字体,字号就是中文字符的宽度
  20. activated钩子函数

热门文章

  1. kubectl源码分析之auth reconcile
  2. 【算法笔记题解】PAT A.1095 Cars on Campus (30 分)
  3. 2022海南最新通信安全员模拟考试试题及答案
  4. 虚拟摄像头搭配高德AR导航出现的内存和cpu问题
  5. 从零到整开发JJ智能生鲜平台(小程序版)
  6. 一个农村女孩的人生能有多少种可能,外出打工?或者留在老家嫁人?
  7. 【Python强化】使用pandas和csv读取csv文件
  8. 九龙证券|全市场注册制下 多层次资本市场定位更清晰
  9. 卷妹的面试小抄每日更新Day1
  10. 基于JAVA在线家教预约系统计算机毕业设计源码+系统+lw文档+部署