在分析SQL server 性能的时候你可能经常看到 PAGELATCH和PAGEIOLATCH。比方说

Select * from sys.dm_os_wait_stats

的输出里面就有Latch的有关信息:

那么什么是PAGELATCH和PAGEIOLATCH呢?

先说什么Latch。 Latch是SQL server内部用来同步资源访问的一个数据结构,和操作系统的critical section 或 ReaderWriterLock类似。Latch保护了那些想保护的资源,使得访问同步有序。比方说,当某个线程获得某个资源的latch的独占使用权的时候,别的线程如果也需要访问这个latch则它必须等待。

那么什么是PAGELATCH呢?

很简单,用来同步访问数据库PAGE的latch就是PAGELATCH了。SQL server的Buffpool里每个数据库页(8kb的PAGE)都有一个对应的LATCH。 要访问某个PAGE必须首先获得这个PAGE的LATCH。PAGELATCH有很多种,如共享的PAGELATCH_SH,独占的PAGELATCH_EX等。独占的意思是排他性访问。共享的意思是可以有多个线程同时获得这个latch。

那么什么是PAGEIOLATCH呢?

就是当这个数据库页不在内存里面必须从磁盘读取的时候,那么latch的类型就是PAGEIOLATCH了。其它方面和PAGELATCH一样。

一个有趣的现象是,有时候你发现某个SPID被自己阻塞住了,等待的latch是PAGEIOLATCH_SH. 为什么会自己等待自己呢? 这个得从SQL server读取页的过程说起。SQL server从磁盘读取一个page的过程如下:

    1. Acquires an EX latch on the page that does not exist in the buffer pool (EX mode: blocking others, and no duplicate same IO will be issued) 该页不在内存里面,SQL server 申请并得到该页的EX独占类型的latch。
    2. Issues the I/O request to read the page from disk 发出I/O读取该页到Bufferpool。
    3. Tries to acquire another latch that has the shared (SH) latch mode on the same page. Because an EX latch has already been acquired, the SH latch request is blocked, and the SPID is suspended, so temporarily it seems the same SPID was blocking itself试图在该页上面获得另外一个共享类型latch。因为该页的latch EX已经获得,而EX和SH不兼容,所以SH必须等待。看起来就像自己等待自己。
    1. When the I/O request finishes, the EX latch on the page is released 当页读取完毕,EX latch释放。
    2. Release of the EX latch gives the SH latch to the same thread 因为Latch EX 释放,Latch SH就成功获得。
    3. The thread can now read the page 现在该线程成功获得latch SH,可以读取该页了(该页已经在内存里面了)。

可能有人有疑问,latch和lock有什么区别呢?主要是使用的地方和目的不一样。Latch用来保护SQL server内部的一些资源(如page)的物理访问,可以认为是一个同步对象。而lock则强调逻辑访问。比如一个table,就是个逻辑上的概念,物理上一个表是有很多页组成的。访问一个表的记录的时候,首先可能需要获得表的共享锁,然后获得某个页的latch,然后就可以读取该页的记录。Lock是全局性的,由统一的lock manager管理。而latch没有统一的manager管理的。

最新文章

  1. apache 配置rewrite模块,URL中隐藏index.php
  2. 使用TopSelf创建自宿主的Windows服务程序
  3. jquery本地上传预览扩展(隐藏上传控件单击图片上传支持ie!!)
  4. Middleware的艺术
  5. 【转】./configure && make && make install详解
  6. Linux C 程序 进程控制(17)
  7. Invoke()方法的使用
  8. 稀疏矩阵coo_matrix的乘法
  9. Windows下配置环境变量和需不需要重启问题
  10. android音乐播放器开发 SweetMusicPlayer 实现思路
  11. 如何提取出ppt中的文字?
  12. 随机生成A~Z的字母CharDemo
  13. Hadoop-1.0.4伪分布安装与配置
  14. 虚拟机上的Ubuntu 文件系统成为只读模式的解决办法
  15. JS学习笔记Day6
  16. 14.命令模式(Command Pattern)
  17. P1115 最大子段和
  18. Linux 内核 hlist 详解
  19. 【转】ELK到底是什么鬼?辣么多公司用!
  20. 一次单片机 SFR 页引发的“事故”

热门文章

  1. option_match
  2. activiti5.22整合modeler时出错TypeError: Cannot read property 'split' of undefined
  3. 使用 CXF 做 webservice 简单例子(转载)
  4. SpringBoot获取resource下证书失败
  5. App上架流程[利用Archive进行上传]
  6. [C#.net]Connection Timeout和Command Timeout
  7. springMVC学习一 工作机制
  8. syslog系统日志、Windows事件日志监控
  9. php多表查询数据合并,避免foreach循环嵌套
  10. MariaDBConn用于链接MariaDB的管理类