sql server中PageLatch和PageIOLatch等待
sql server中PageLatch和PageIOLatch等待一、什么是Latch
Latch是SQL server内部用来同步资源访问的一个数据结构,和操作系统的critical section 或 ReaderWriterLock类似。Latch保护了那些想保护的资源,使得访问同步有序。比方说,当某个线程获得某个资源的latch的独占使用权的时候,别的线程如果也需要访问这个latch则它必须等待。
二、PageLatch
1、PAGELATCH_x类型的latch是SQL Server在缓冲池里的数据页面上经常加的一类latch。它用来同步访问buff pool中的数据页。SQL server中的Buff pool里每个page都有一个对应的LATCH。 要访问某个PAGE必须首先获得这个PAGE的LATCH。
2、在访问数据库的数据页(Data Page或Index Page)时,如果相应的buffer已经存在于Buffer Pool中,那么SQL Server先获取buffer的latch,这个Latch就是 PageLatch,然后读取Buffer中的数据。
3、PageLatch是Buffer Latch, 用来保护:Data page,Index Page, 系统page(PFS,GAM,SGAM,IAM等);在数据更新时,分配新的page,或拆分 index Page,会产生PageLatch 等待。
三、PageIOLatch
1、如果数据页不存在于Buffer Pool中,SQL Server必须从Disk中将数据加载到内存,此时,SQL Server在Buffer Pool中预留一个Buffer,并为该Buffer申请一个PageIOLatch_EX,表示正在加载Data Page或Index Page到内存;如果数据页已经加载到内存,那么 PageIOLatch_EX 释放。
2、在从Disk读取到Buffer期间,需要访问该数据页的所有Thread都需要等待,等待类型是:PageIOLatch_SH,PageIOLatch_EX 和 PageIOLatch_SH是不兼容的。
3、直到Disk的读取过程完成,PageIOLatch_EX释放,Thread申请到PageIOLatch_SH,表示数据页已经存在于Buffer Pool中。
四、当等待中出现很多PAGELATCH_ 等待,一般说明
1、SQL Server没有明显的内存和磁盘瓶颈。
2、应用程序发来大量的并发语句在修改同一张表格里的记录,而表格架构设计以及用户业务逻辑使得这些修改都集中在同一个页面,或者数量不多的几个页面上。这些页面有的时候也被称为Hot Page。这样的瓶颈通常只会发生在并发用户比较多的、典型的OLTP系统上。
3、这种瓶颈是无法通过提高硬件配置解决的,只有通过修改表格设计或者业务逻辑,让修改分散到尽可能多的页面上,才能提高并发性能。
五、当等待中出现很多PAGELATCH_ 等待,一般说明
当你的系统出现大量的 PAGEIOLATCH_ 类等待,说明你磁盘可能存在压力(磁盘速度不能满足当前业务需求)或你的内存不够用,不能缓存业务常用数据而经常要与磁盘交互!