博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是PAGELATCH和PAGEIOLATCH
阅读量:5036 次
发布时间:2019-06-12

本文共 1929 字,大约阅读时间需要 6 分钟。

在分析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管理的。

 

转自:https://blogs.msdn.microsoft.com/apgcdsd/2011/11/28/pagelatchpageiolatch/

 

转载于:https://www.cnblogs.com/davidhou/p/6673188.html

你可能感兴趣的文章
大型分布式网站架构技术总结
查看>>
HDU 1017[A Mathematical Curiosity]暴力,格式
查看>>
[算法之美] KMP算法的直观理解
查看>>
EntityFramework 性能优化
查看>>
Python学习-文件操作
查看>>
CSS 清除所有的边距
查看>>
jquery.validate.js使用指南
查看>>
java.util.TaskQueue的最小堆排序算法的应用
查看>>
USACO Cow Pedigrees
查看>>
开坑写博客1-2013电子设计大赛-四旋翼自主飞行器
查看>>
输入一个半径求圆的面积和周长
查看>>
出现Bad command or the file name的原因
查看>>
启动asp.net 2.0 服务
查看>>
UVa-10976 Fractions Again?!
查看>>
HDU 5536 Chip Factory 字典树
查看>>
Educational Codeforces Round 9 D. Longest Subsequence dp
查看>>
Educational Codeforces Round 11 D. Number of Parallelograms 暴力
查看>>
C#:只读字段, 匿名类型
查看>>
IOS TableView的Delegate Methods-tableView didSelectRowAtIndexPath
查看>>
一条sql
查看>>