SQL Server里等待统计(Wait Statistics)介绍
在今天的文章里我想详细谈下SQL Server里的统计等待(Wait Statistics),还有她们如何帮助你立即为什么你的SQL Server当前很慢。一提到性能调优,对我来说统计等待是SQL Server了最重要的概念。
查询为什么等待
在SQL Server里每次你执行1个查询,查询总需要等待。什么?查询总需要等待?是的,你没有看错:但给你执行1个查询时,查询总需要等待。为什么查询需要等待的原因是SQL Server通过所谓的等待统计(Wait Statistics)来跟踪的。在我进入等待统计(Wait Statistics)细节内容前,我想谈下SQL Server里查询总需要等待的原因。在SQL Server里查询发生等待有2个原因:
- 资源等待
- 协同调度(Cooperative Scheduling)等待
我们来详细看下这2类等待。当你等待外部资源时会发生资源等待(Resource Wait)。这里我想你一些例子。每次一个查询从缓存池请求1个页时,如果这个页没被缓存的话,缓存区管理器需要到你的存储进行异步I/O操作,从你的物理存储读取页到缓存池。而且访问物理存储会非常慢。由于这个原因SQL Server会拿掉你查询的CPU周期,查询只会等待直到异步I/O操作完成(同事其它查询可以更有效的使用CPU资源)。最后你的查询继续它的执行。
当你需要获取锁时也会发生同样的事情——当你想要读或修改数据时。当其它人已经获得了不兼容的锁,你的查询需要去等待直到锁可以获得。同时SQL Server会再次拿掉你的CPU周期,查询需要去等待直到其它查询的不兼容锁释放掉,这样的话查询本身可以获得请求的锁。
除资源等待外,SQL Server查询还会因SQLOS(SQL Server操作系统(OS))内部实现的协同调度(Cooperative Scheduling)而等待。SQL Server绕过Windows系统的抢占式调度(Cooperative Scheduling),调度它的线程本身。因为这样的设计SQL Server会更容易扩展,并为你提供更好的吞吐量。当1个查询在CPU上积极运行时,SQL Server本身就可以决定,当1个查询从CPU上拿掉时,SQL Server也可以决定,这样的话另1个查询可以在那个CPU上活跃继续它的查询执行。由于这个原因,一旦查询溢出所谓的量(Quantum),SQL Server就会把你的查询从CPU上拿掉。
量定义了查询在CPU上可以活跃花费的时间片(time slice)。在SQL Server里这个时间片是4毫秒长。这就是说一旦查询完成它的工作超出4毫秒,SQL Server就会把你的查询从CPU上拿掉。因此在SQL Server里查询总是要等待。如果没有资源等待,溢出量就会踢入,查询会在CPU上睡着(going off)。你的查询总会等待!
查询生命周期
我们我们知道了在SQL Server里查询总需要等待。我们来进一步看下它。当你执行1个查询,这个查询会进入3个不同的状态,如下图中所示:

我们来详细说下这3个状态。只要你的查询在你的CPU上积极运行,这个查询是在RUNNING状态。RUNNING状态意味着你的查询当前正进行一些工作。进入这个状态一直是你的首要目标。当SQL Server把你的查询从CPU上拿掉时,然后这个查询移入了SUSPENDED状态。查询只要SUSPENDED状态需要都会等待,直到请求的资源可用(回想下从你物理存储读取的页,或者不能立即获得的不兼容锁)。
当请求的资源可用时,然后SQL Server把你的查询移入RUNNABLE状态。RUNNABLE状态意味着你的查询准备好了继续执行,但它需要另外必需的东西:在它上面运行的CPU。当现在没有可用的CPU时(因为其它查询当前在RUNNING状态),查询需要在RUNNABLE状态花费一些时间。 最后当CPU变成可用时,查询移入RUNNING状态,然后一切轮回继续。一个简单的查询在执行期间,可以运行上几百次,甚至几千次的查询生命周期(query life cycle )。
分析等待统计(Wait Statistics)
所有这些状态事务被SQL Server跟踪,并通过等待统计反馈给我们。SQL Server通过DMV sys.dm_os_wait_stats 来披露这些等待统计(Wait Statistics)。从这个DMV返回的每条记录都是SQL Server里的1个等待原因。在SQL Server 2014里你共有771个不同的为什么查询会等待的原因。什么?771个不同原因?跟我开玩笑吧?那是很多的!没错!但一般来说你只需要处理一些特定的等待原因,因为我们每个人几乎都处理SQL Server里同样的性能问题:
- 缓慢的存储子系统
- 不好的索引设计
- 锁/阻塞问题
- 低效的并行执行计划
- CPU压力
- ……
当在面前有一个运行慢的SQL Server,第一步我总看下等待统计里的详细信息,因为它们告诉我为什么SQL Server里查询在等待。但SQL Server里的等待统计只是个症状,不是问题根源本身!或许SQL Server通过等待统计告诉你在过去有一些因阻塞情形的等待。但可能是不是你有一个不好的索引设计,缺失了一个非常重要的非聚集索引导致了阻塞情形?有了额外的非聚集索引你提供SQL Server额外的数据访问路径,是否你的阻塞情形就可以轻松解决?这只是症状并非根源的1个例子(很多中的)。
小结
在这个文章里我给你概况介绍了在SQL Server里为什么查询会等待,还有这些等待如何通过等待统计来跟踪。等待统计里最重要的事情是SQL Server里它只告诉你症状,并不是问题根源。作为故障排除人,你的工作是读和理解统计等待,最后挖出你SQL Server里更多的信息来找出潜在的问题根源。
感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2015/04/13/introduction-to-wait-statistics-in-sql-server/
SQL Server里等待统计(Wait Statistics)介绍的更多相关文章
- SQL Server里的闩锁介绍
在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...
- SQL Server里的自旋锁介绍
在上一篇文章里我讨论了SQL Server里的闩锁.在文章的最后我给你简单介绍了下自旋锁(Spinlock).基于那个基础,今天我会继续讨论SQL Server中的自旋锁,还有给你展示下如何对它们进行 ...
- SQL Server里Grouping Sets的威力
在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...
- SQL SERVER常见等待——解决会话等待产生的系统问题
SQL SERVER——解决会话等待产生的系统问题 转自: https://blog.csdn.net/z_cloud_for_SQL/article/details/55051215 版权声明:SQ ...
- SQL Server里Grouping Sets的威力【转】
在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...
- SQL Server里的文件和文件组
在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个 ...
- 在SQL Server里为什么我们需要更新锁
今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需 ...
- SQL Server里的INTERSECT
在今天的文章里,我想讨论下SQL Server里的INTERSECT设置操作.INTERSECT设置操作彼此交叉2个记录集,返回2个集里列值一样的记录.下图演示了这个概念. INTERSECT与INN ...
- SQL Server里如何随机记录集
今天的文章,我想给你简单介绍下SQL Server里如何随机记录集. SELECT * FROM Person.Person ORDER BY NEWID() GO 这会引入新的UNIQUEIDENT ...
随机推荐
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
- Swift入门篇-基本类型(2)
现在我也在学习Swift语言,常常去逛很多苹果社区和论坛,看到了圈子很多奇怪的现象,发现很多人都赶忙去翻译 Swift书籍 和 发布Swift的视频 .他们这种对新知识的探索精神我本人是很佩服的.但是 ...
- YChaos生成混沌图像
YChaos是一款通过数学公式生成混沌图像的软件,展示混沌之美,数学之美.软件中定义一套简易的脚本语言,用于描述数学表达式.使用时需要先要将数学表达式写成该脚本的形式,解析脚本代码以生成相应的图形与图 ...
- 【字符串排序】n个数连接得到最小或最大的多位整数
题目 描述:设有n个正整数,将它们依次连成在一排,组成一个多位数,现在要求可能组成的多位数中最大的多位数是什么? 例如:n=3时,3个整数13,312,343连成的最大多位数为:343-312-13. ...
- WPF TextBlock 绑定 换行
最近有个小需求 需要在textblock中换行 其实textblock换行有很多写法,比如: Xaml: <TextBlock Text="AAAAA BBBBB" /> ...
- 苹果 Mac OS 下查看系统隐藏文件
Mac OS X中有很多系统隐藏的信息文件, 一般在Finder中都是看不到,也修改不了的. 但通过在"终端"中输入命令, 就可以在Finder中显示出来: defaults wr ...
- SQL Server への接続を許可するファイアーウォール設定
netsh advfirewall firewall add rule name="SQL Server Browser" protocol=UDP dir=in localpor ...
- ios中将事件添加到系统日历
- (void)saveEvent:(id)sender { //事件市场 EKEventStore *eventStore = [[EKEventStore alloc] init]; //6.0及 ...
- Spring3系列5-Bean的基本用法
Spring3系列5-Bean的基本用法 本篇讲述了Bean的基本配置方法,以及Spring中怎样运用Bean. 主要内容如下: 一. Spring中Bean的相互引用 二. Sp ...
- Android实现自适应正方形GridView(陌陌引导页面效果)
1.http://blog.chengyunfeng.com/?p=465 2.备注,慢慢研究