Latch2:Latch和性能
1,数据的IO操作
SQL Server访问的任何一个Page必须存在于内存中,如果不存在于内存中,那么SQL Server发出 Disk IO请求,将数据页从Disk读取到内存中,然后SQL Server从内存中读取该Page的内容。在访问任何一个内存page之前,必须申请和获取该Page上的Latch。
在数据读取的过程中,SQL Server先在内存中预留一个Page的空间,并设置该Page的位BUF_IO=1,并发出Disk IO请求,此时,在该Page上加的Latch是PageIOLatch_EX,表示正在将数据页从Disk读取到内存。
在数据页加载的过程中,任何一个读取该Page的Thread,在该Page上加的Latch是PAGEIOLATCH_SH,表示在SQL Server Engine从Disk读取数据页,写入内存时,Thread试图读取该Page,由于PAGEIOLATCH_SH和PageIOLatch_EX不兼容,读取该Page的Thread会被Block,直到Page被读取到内存中。
一旦数据页被写入到内存中,PageIOLatch_EX会立即释放,并设置该Page的位BUF_IO=0。由于数据页存在于内存中,对该Page申请的Latch是PageLatch。
如果发生PAGEIOLATCH类型的等待,那么SQL Server一定是在等待Disk I/O操作的完成。如果经常出现这类等待,说明磁盘速度不能满足要求,已经成为SQL Server的瓶颈。PAGEIOLATCH_XX主要分为两大类:PAGEIOLATCH_SH和PAGEIOLATCH_EX。
PAGEIOLATCH_SH 发生在用户访问一个数据页,同时SQL Server正在将数据页从磁盘写入内存,经常发生PAGEIOLATCH_SH等待,说明内存不够大,导致SQL Server需要做很多页面读取的操作,磁盘IO是内存压力的副作用。
PAGEIOLATCH_EX:发生在从Disk page读取到内存buffer中,经常发生PAGEIOLATCH_EX等待,说明Disk读取速度慢,这和内存没直接关系。
2,数据页成为HotPage
当一个Task要修改页面时,它必须先申请一个EX的Latch,即PageLatch_EX。只有获取到Latch,才能修改页面的内容。由于数据页的修改都是在内存中完成,所以时间应该非常短,可以忽略不计。而PAGELATCH_EX只是在修改过程中才出现,所以生存周期应该很短,如果出现了,说明:1、SQL Server没有明显的内存和磁盘瓶颈。2、应用程序发出大量的并发语句修改同一张表,而修改操作集中在同一个页面,或者数量不多的几个页面上,成为Hot Page。3、这种瓶颈无法通过提高硬件配置解决,只能修改 Table的存储,使修改分散在更多的Page上,提高并发修改的能力。
Hot page的缓解方法:
(1)、换一个数据列建聚集索引,而不要在Identity字段上,同一时间插入有机会分散到不同的页面上。
(2)、如果一定要在Identity的字段上建聚集索引,建议在其他某个列上创建若干个分区。
(3)、为FileGroup增加File,尽量将Files分布在不同的Physical Disk上。
3,在tempdb中,系统Page成为Hot Page
SQL Server不仅在数据页面上加Latch,而且在数据文件的系统页面上,例如SGAM、PFS和GAM页面等,也会加Latch。系统Page有时候也会成为系统瓶颈。
在创建新表时,SQL Server 需要分配空间。分配存储空间需要同时修改SGAM、PFS和GAM页面,设置标识位,由于一个系统Page的标志位管理很多数据页,当频繁的创建和删除表结构时,而这些数据页都发生在同一个系统Page,或者数量不多的几个系统Page上,会使该系统Page过热,成为Hot Page。在tempdb中,创建和删除table结构的操作会并发、反复发生,容易使系统页过热,产生hot Page。系统page过热,可以通过调整表设计来缓解。对此的解决方法:
- 建立与cpu数量相同的tempdb文件,保持File Size相同,使得每个File承担的IO压力相对平均
- 禁止 tempdb 文件自动增长,避免单个文件不平均增长
Latch2:Latch和性能的更多相关文章
- Distribution2:Distribution Writer
Distribution Writer 调用Statement Delivery 存储过程,将Publication的改变同步到Subscriber中.查看Publication Properties ...
- SQL Server PageIOLatch和PageLatch
Latch是轻量级的锁,它是SQL Server内部用来同步资源访问的一个数据结构,使数据的访问同步有序,这意味着,当一个线程获得资源R的Latch的独占使用权时,如果其他的线程也想访问这个Latch ...
- PageIOLatch和PageLatch
Latch是轻量级的锁,它是SQL Server内部用来同步资源访问的一个数据结构,使数据的访问同步有序,这意味着,当一个线程获得资源R的Latch的独占使用权时,如果其他的线程也想访问这个Latch ...
- SD卡WAV音乐播放器(quartus11.0)(FAT32)(DE2-115)
准备工具:格式工厂,Windows录音机,SD卡(小于等于2G),音箱 首先,选一首MP3,用格式工场转化成WAV格式.可以看到转化后的文件变得很大,因为WAV就是AD采样值加个文件头,所以数据量巨大 ...
- 【转】cache buffer chain 第一篇
文章转自:http://www.jydba.net/cache-buffer-chain/ buffer cache的管理有两个重要的数据结构: hash bucket和cache buffer ch ...
- oracle buffer cache的基本原理
Buffer cache 的原理 一. 1·)当一个服务器进程需要读数据到buffer cache中时,首先必须判断该数据在buffer 中是否存在,如果存在且可用,则获取该数据,根据lru算法在lr ...
- BUFFER CACHE和SHARED POOL原理
http://blog.csdn.net/wanghai__/article/details/4881492 Buffer Cache LRU与Dirty List 在Buffer Cache中,Or ...
- 学习动态性能表(11)v$latch$v$latch_children
学习动态性能表 第十一篇-(1)-V$LATCH 2007.6.7 Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串 ...
- SQL 性能调优中可参考的几类Lock Wait
在我们的系统出现性能问题时,往往避不开调查各种类型 Lock Wait,如Row Lock Wait.Page Lock Wait.Page IO Latch Wait等.从中找出可能的异常等待,为性 ...
随机推荐
- org.openqa.selenium.remote.SessionNotFoundException: Unexpected error launch IE
1.在启动ie浏览器前先加入属性设置一项: DesiredCapabilities ie = DesiredCapabilities.internetExplorer(); ie.setCapabil ...
- ACM: Gym 101047B Renzo and the palindromic decoration - 手速题
Gym 101047B Renzo and the palindromic decoration Time Limit:2000MS Memory Limit:65536KB 64 ...
- NOIP提高模拟题 混乱的队伍
混乱的奶牛 Description 混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 & ...
- iOS 中自定义 cell,点击cell的时候文字不出现的原因
解决方案: 在setSelected方法中设置要显示label的背景颜色即可
- VMware创建Linux虚拟机并安装CentOS(一)
在VMware中新建虚拟机,在新建虚拟机向导中,选择“自定义(高级)”选项,鼠标单击“继续”按钮 选择VMware的版本workstation9.0(VMware版本对硬盘.内存.cpu等硬件的支持大 ...
- [转]关于SVN的操作批处理示例
为了一句话:不要动手做机器能够做的事情. 天天工作用svn,更新啥的打开目录啥的动作天天在重复.每次写些命令也蛮无聊的,不说了,看下面: @echo off rem 显示部分 @echo 注 意 事 ...
- GIT 版本控制常用命令学习汇总
GIT 版本控制常用命令汇总 git version 查看当前git版本信息 git help 获取全部命令帮助信息 git help <command> 获取指定命令帮助信息 git c ...
- Allegro之Win7下不能实时刷新操作显示的问题
Allegro软件主界面下: setup-> user preferences-> display->opengl中选定disable_opengl,即关掉OpenGL后,再重新启动 ...
- php函数类型
静态变量: <?php function calcute(){ static $num =10; $num = $num+2; echo $num."<br>"; ...
- C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
本人今天遇到的错误,C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误. 测试了很久,才发现,是安全协议问题,把安全协议加上就可以了