要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据。

  

sys.dm_os_wait_stats

这是一个系统视图,里面存储线程所遇到的所有的等待信息,具体的列如下表

列名

数据类型

说明

Wait_type

Nvarchar(60)

等待类型名称

waiting_tasks_count

Bigint

等待类型的等待数。该计数器在每开始一个等待时便会增加。

Wait_time_ms

Bigint

该等待类型的总等待时间。

Max_wait_time_ms

Bigint

该等待类型的最长等待时间。

Signal_wait_time_ms

Bigint

正在等待的线程从收到信号通知到开始运行之间的时差。

要注意的是,这个视图的信息每次关闭SQL Server的时候都会自动清除,下次打开SQL Server的时候又会重新开始统计。

  

新建线程等待信息表

如果想得到连续的信息,在固定时间间隔内收集信息比如一个小时一次,这样就可以分析系统分配的等待时间,识别出繁忙时间段。这里我们将这些信息收集到一个数据表中保存并进行分析。使用下面的语句新建一个表:

  1.  
  2. use AdventureWorks
  3.  
  4. CREATETABLE dbo.WaitStats
  5.  
  6. (
  7.  
  8. dt DATETIMENOTNULLDEFAULT (CURRENT_TIMESTAMP),
  9.  
  10. wait_type NVARCHAR(60) NOTNULL,
  11.  
  12. waiting_tasks_count BIGINTNOTNULL,
  13.  
  14. wait_time_ms BIGINTNOTNULL,
  15.  
  16. max_wait_time_ms BIGINTNOTNULL,
  17.  
  18. signal_wait_time_ms BIGINTNOTNULL
  19.  
  20. );
  21.  
  22. CREATEUNIQUECLUSTEREDINDEX idx_dt_type ON dbo.WaitStats(dt, wait_type);
  23.  
  24. CREATEINDEX idx_type_dt ON dbo.WaitStats(wait_type, dt);

  

新建job填充数据

要收集信息最好是用一个job来定时地执行insert语句填充数据,下面介绍步骤

  1. 点击数据库中的SQL Server Agent,展开,右击jobs文件夹,右击新建。如图1

    图1

  2. 在新建job界面,General标签中填写job名称,描述,如图2

    图2
  3. 点击Setps标签,点击新建按钮,在新建step界面内设置Step Name,Type,DataBase,Command等属性,如下图3。这些属性一看就知道是要做什么的,就不一一的解释了。还要说的 是截图是建好的job,如果你自己做的话对话框显示的标题可能不一样。


    图3
    Command属性是设置要执行的SQL语句或存储过程等等,这里设置如下的SQL Script:

    1.  
    2. INSERTINTO Performance.dbo.WaitStats
    3. (wait_type, waiting_tasks_count, wait_time_ms,
    4. max_wait_time_ms, signal_wait_time_ms)
    5. SELECT
    6. wait_type, waiting_tasks_count, wait_time_ms,
    7. max_wait_time_ms, signal_wait_time_ms
    8. FROM sys.dm_os_wait_stats
  4. 点击Shedules标签,设置job的执行计划,这里设置的是每天的每5分钟执行一次如图4
                                                                
    图4

上述步骤包含了新建一个job的主要设置,其他的细节信息没有包含,遇到具体问题再具体分析吧。

收集等待信息数据

过一段时间之后在表WaitStats中就会有一些数据,每隔5分钟就会在这个表中写入一些数据,这些数据会不断的增加。这里为了得到相邻间隔之间线程等待时间的变化就要使用自连接,连接条件是等待类型相同,当前行号等于上一个的行号加上1,然后就可以用上一次等待时间减去这一次的等待时间得到这个变化值,下面使用一个函数来实现这个逻辑:

  1.  
  2. IFOBJECT_ID('dbo.IntervalWaits', 'IF') ISNOTNULL
  3. DROPFUNCTION dbo.IntervalWaits;
  4. GO
  5. CREATEFUNCTION dbo.IntervalWaits
  6. (@fromdtASDATETIME, @todtASDATETIME)
  7. RETURNSTABLE
  8. AS
  9. RETURN
  10. WITH Waits AS
  11. (
  12. SELECT dt, wait_type, wait_time_ms,
  13. ROW_NUMBER() OVER(PARTITION BY wait_type
  14. ORDERBY dt) AS rn
  15. FROM dbo.WaitStats
  16. )
  17. SELECT Prv.wait_type, Prv.dt AS start_time,
  18. CAST((Cur.wait_time_ms - Prv.wait_time_ms)
  19. /1000. AS NUMERIC(12, 2)) AS interval_wait_s
  20. FROM Waits AS Cur
  21. JOIN Waits AS Prv
  22. ON Cur.wait_type = Prv.wait_type
  23. AND Cur.rn = Prv.rn +1
  24. AND Prv.dt >=@fromdt
  25. AND Prv.dt <DATEADD(day, 1, @todt)
  26. GO

这个函数接受两个参数,开始统计时间,结束统计时间,返回等待变化的时间,并按照类型排序。调用这个函数如下:

SELECT wait_type, start_time, interval_wait_s

FROM dbo.IntervalWaits('20110509', '20110510') AS F

ORDER BY SUM(interval_wait_s) OVER(PARTITION BY wait_type) DESC,wait_type,start_time;

但是我们不能每次都去调用这个函数,所以可以吧这个查询放在一个视图里面,外部只需要使用视图来查询数据就可以了:

  1.  
  2. IFOBJECT_ID('dbo.IntervalWaitsSample', 'V') ISNOTNULL
  3. DROPVIEW dbo.IntervalWaitsSample;
  4. GO
  5. CREATEVIEW dbo.IntervalWaitsSample
  6. AS
  7. SELECT wait_type, start_time, interval_wait_s
  8. FROM dbo.IntervalWaits('20090212', '20090215') AS F;
  9. GO

从视图中查询得到的数据就是我们要得到的数据。但是这些并不明显,先写到这里,下一个随笔我将在EXECL中把这些数据制作成一个直方图或者连线图,横轴是时间,纵轴是等待间隔时间。这样就会更加直观地看到在那些时间SQL Server的线程等待时间最长,也就是最繁忙的时候。

来源:http://www.cnblogs.com/tylerdonet/archive/2011/05/10/2042447.html

收集SQLServer线程等待信息的更多相关文章

  1. SQL点滴13—收集SQLServer线程等待信息

    原文:SQL点滴13-收集SQLServer线程等待信息 要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信 ...

  2. SQL之收集SQL Server线程等待信息

    要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...

  3. sql server线程等待信息

    http://www.cnblogs.com/lyhabc/articles/3236984.html http://blog.csdn.net/isoleo/article/details/4547 ...

  4. SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强

    本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候, ...

  5. 自动化收集SQLSERVER诊断信息

      自动化收集SQLSERVER诊断信息 相信很多人都遇到过当SQLSERVER出现问题的时候,而你又解决不了需要DBA或者微软售后支持工程师 去帮忙解决问题,那么他们一般需要你收集一些系统信息和SQ ...

  6. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  7. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  8. 使用线程统计信息(Thread Statistics)

    可在session log中使用线程统计信息来判断source,target或组的性能瓶颈 默认情况下,Integration Service在运行session时,使用一个reader thread ...

  9. Java多线程(五)——线程等待与唤醒

    一.wait().notify().notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进 ...

随机推荐

  1. B. Berland Bingo

    Lately, a national version of a bingo game has become very popular in Berland. There are n players p ...

  2. ARM学习笔记3——数据处理指令

    一.数据处理指令概述 1.概念 数据处理指令是指对存放在寄存器中的数据进行处理的指令.主要包括算术指令.逻辑指令.比较与测试指令以及乘法指令 如果在数据处理指令前使用S前缀,指令的执行结果将会影响CP ...

  3. 作品第一课----循环改变DIV颜色

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. ubuntu14.04安装ia32-lib

    sudo apt-get install libc6:i386 sudo -i cd /etc/apt/sources.list.d echo "deb http://old-release ...

  5. Implement the hash table using array / binary search tree

    今天在复习Arrays and String 时看到一个很有趣的问题.希望跟大家分享一下. Implement the hash table using array / binary search t ...

  6. flushall()函数的用法

    flushall()函数 如下所示的一个非常简单的程序. #include void main(void) { char cA,cB; printf("input cA and cB:\n& ...

  7. MAC 下安装opencv遇到问题的解决方法(安装homebrew, wget)

    遇到问题: (1)Mac安装OpenCV下载ippicv_macosx_20141027.tgz失败解决方案 先附上当时的报错信息: -- ICV: Downloading ippicv_macosx ...

  8. C语言中可变参数的用法

    原文地址: http://blog.csdn.net/wooin/archive/2006/04/29/697106.aspx   我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() ...

  9. Eclipse修改字体大小

    1.MyEclipse|Window|General|Appearance|Colors and Fonts->点击Text Font->Edit

  10. hihocoder 1077线段树

    http://hihocoder.com/problemset/problem/1077 #include <bits/stdc++.h> using namespace std; #de ...