在今天的文章里我想详细谈下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)介绍的更多相关文章

  1. SQL Server里的闩锁介绍

    在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...

  2. SQL Server里的自旋锁介绍

    在上一篇文章里我讨论了SQL Server里的闩锁.在文章的最后我给你简单介绍了下自旋锁(Spinlock).基于那个基础,今天我会继续讨论SQL Server中的自旋锁,还有给你展示下如何对它们进行 ...

  3. SQL Server里Grouping Sets的威力

    在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...

  4. SQL SERVER常见等待——解决会话等待产生的系统问题

    SQL SERVER——解决会话等待产生的系统问题 转自: https://blog.csdn.net/z_cloud_for_SQL/article/details/55051215 版权声明:SQ ...

  5. SQL Server里Grouping Sets的威力【转】

    在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...

  6. SQL Server里的文件和文件组

    在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个 ...

  7. 在SQL Server里为什么我们需要更新锁

    今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需 ...

  8. SQL Server里的INTERSECT

    在今天的文章里,我想讨论下SQL Server里的INTERSECT设置操作.INTERSECT设置操作彼此交叉2个记录集,返回2个集里列值一样的记录.下图演示了这个概念. INTERSECT与INN ...

  9. SQL Server里如何随机记录集

    今天的文章,我想给你简单介绍下SQL Server里如何随机记录集. SELECT * FROM Person.Person ORDER BY NEWID() GO 这会引入新的UNIQUEIDENT ...

随机推荐

  1. Solr5之Schema.xml详解

    schema.xml 是用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否分词,是否存储,是否标准化即 Norms ,是否存储项向量等等. schema.xml 配置文件的根元素就是 sc ...

  2. windbg-bp、 bm、 bu、 bl、 bc、 ba(断点、硬件断点)

    bp bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会自动找到MyApp!SomeFunction 对 ...

  3. 2014年黑金FPGA原创教程规划发布

    2014年已经过去快一半了,才出黑金2014年的FPGA原创教程规划,有点对不起大家了,哈哈! 俗话说,亡羊补牢,为时不晚,希望大家谅解啊,对于大家的支持,我们黑金人一向是感激.感恩.感谢! 下面大概 ...

  4. 【转】如何判断Javascript对象是否存在

    Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: ...

  5. 将数据库表导入到solr索引

    将数据库表导入到solr索引 编辑solrcofnig.xml添加处理器 <requestHandler name="/dataimport" class="org ...

  6. 解决Visual Studio 2010新建工程时出现『1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt』错误

    VS2010在经历一些更新后,建立Win32 Console Project时会出"error LNK1123" 错误.   解决方案为: 第一步:将:项目|项目属性|配置属性|清 ...

  7. 你还在问android横竖屏切换的生命周期?

    本文原创,转载请注明来自xiaoQLuhttp://www.cnblogs.com/xiaoQLu/p/3324503.html 开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题. ...

  8. ZOJ 2753 Min Cut (Destroy Trade Net)(无向图全局最小割)

    题目大意 给一个无向图,包含 N 个点和 M 条边,问最少删掉多少条边使得图分为不连通的两个部分,图中有重边 数据范围:2<=N<=500, 0<=M<=N*(N-1)/2 做 ...

  9. 二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

  10. 使用hessian+protocol buffer+easyUI综合案例--登陆

    首先先简单介绍下hessian ,protocol buffer, easyUI框架 hessian: Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协 ...