`

什么是PAGELATCH和PAGEIOLATCH

 
阅读更多
在分析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是PAGELATCH_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必须等待。看起来就像自己等待自己。


4.When the I/O request finishes, the EX latch on the page is released 当页读取完毕,EX latch释放。
5.Release of the EX latch gives the SH latch to the same thread 因为Latch EX 释放,Latch SH就成功获得。
6.The thread can now read the page 现在该线程成功获得latch SH,可以读取该页了(该页已经在内存里面了)。




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

相关推荐

    SQL Server误区30日谈 第12天 TempDB的文件数和需要和CPU数目保持一致

    TempDB的性能问题通常表现为两种类型的阻塞:PAGELATCH和PAGEIOLATCH。PAGELATCH表示内存分配位图的争用,而PAGEIOLATCH则表明I/O子系统存在冲突。使用动态管理视图(DMV)如`sys.dm_os_wait_stats`可以帮助识别这些...

    SQLServer内存问题排查思路.docx

    sys.sysprocesses视图中,查找与IO相关的等待类型(ASYNC_IO_COMPLETION、PAGEIOLATCH_SH等)可识别数据库页的读写压力。waittype为0x00B9、0x007B、0x011A的进程等待事件揭示了Stolen Memory和Multi-page缓存的问题...

    清除SQL挂起

    2. **分析等待类型**:挂起的SQL查询通常与特定的等待类型关联,如LCK_M_XX(锁定等待)、PAGEIOLATCH_XX(I/O缓冲区等待)等。理解这些等待类型有助于确定问题根源。 3. **资源争用**:如果挂起与资源争用有关,...

    MSSQL通过等待优化数据库

    假设一个生产环境中的数据库在夜间备份过程中性能急剧下降,通过查询`sys.dm_os_wait_stats`发现`PAGEIOLATCH_SH`类型的等待时间异常高。这可能表明磁盘I/O成为瓶颈,或者是大量并发读取操作导致的数据页锁定竞争。...

Global site tag (gtag.js) - Google Analytics