背景

我们随时监控每个服务器不同时间段的wait statistics ,可以根据监控信息大概判断什么时候开始出现异常,相当于一个wait statistics基线收集,还可以具体分析占比高的等待类型可以大概推断出当前服务器存在一些什么性能瓶颈。当然如需分析到具体的语句也可以分析数据库上收集的Trace文件或其他手段。

测试环境

Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
Feb 10 2012 19:39:15 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )

实现过程

a.新建库

  1. USE [master];
  2. CREATE DATABASE [BaselineData] ON PRIMARY ( NAME = N'BaselineData', FILENAME = N'D:\data\BaselineData.mdf', SIZE = 512MB, FILEGROWTH = 512MB )
  3. LOG ON ( NAME = N'BaselineData_log', FILENAME = N'E:\log\BaselineData_log.ldf', SIZE = 128MB, FILEGROWTH = 512MB );
  4. ALTER DATABASE [BaselineData] SET RECOVERY SIMPLE;

b.新建表

  1. USE [BaselineData];
  2. IF NOT EXISTS ( SELECT *
  3. FROM [sys].[tables]
  4. WHERE [name] = N'WaitStats'
  5. AND [type] = N'U' )
  6. CREATE TABLE [dbo].[WaitStats]
  7. (
  8. [RowNum] [BIGINT] IDENTITY(1, 1) ,
  9. [CaptureDate] [DATETIME] ,
  10. [WaitType] [NVARCHAR](120) ,
  11. [Wait_S] [DECIMAL](14, 2) ,
  12. [Resource_S] [DECIMAL](14, 2) ,
  13. [Signal_S] [DECIMAL](14, 2) ,
  14. [WaitCount] [BIGINT] ,
  15. [Percentage] [DECIMAL](4, 2) ,
  16. [AvgWait_S] [DECIMAL](14, 2) ,
  17. [AvgRes_S] [DECIMAL](14, 2) ,
  18. [AvgSig_S] [DECIMAL](14, 2)
  19. );
  20. CREATE CLUSTERED INDEX CI_WaitStats ON [dbo].[WaitStats] ([RowNum], [CaptureDate]);

c.查询等待统计信息

  1. USE [BaselineData];
  2. INSERT INTO dbo.WaitStats
  3. ( [capturedate] ,
  4. [WaitType]
  5. )
  6. VALUES ( GETDATE() ,
  7. 'Wait Statistics for ' + CAST(GETDATE() AS NVARCHAR(19))
  8. );
  9. INSERT INTO dbo.WaitStats
  10. ( [CaptureDate] ,
  11. [WaitType] ,
  12. [Wait_S] ,
  13. [Resource_S] ,
  14. [Signal_S] ,
  15. [WaitCount] ,
  16. [Percentage] ,
  17. [AvgWait_S] ,
  18. [AvgRes_S] ,
  19. [AvgSig_S]
  20. )
  21. EXEC
  22. ( ';WITH [Waits] AS
  23. (SELECT
  24. [wait_type],
  25. [wait_time_ms] / 1000.0 AS [WaitS],
  26. ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
  27. [signal_wait_time_ms] / 1000.0 AS [SignalS],
  28. [waiting_tasks_count] AS [WaitCount],
  29. 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
  30. ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
  31. FROM sys.dm_os_wait_stats
  32. WHERE [wait_type] NOT IN (
  33. N''BROKER_EVENTHANDLER'', N''BROKER_RECEIVE_WAITFOR'',
  34. N''BROKER_TASK_STOP'', N''BROKER_TO_FLUSH'',
  35. N''BROKER_TRANSMITTER'', N''CHECKPOINT_QUEUE'',
  36. N''CHKPT'', N''CLR_AUTO_EVENT'',
  37. N''CLR_MANUAL_EVENT'', N''CLR_SEMAPHORE'',
  38.  
  39. -- Maybe uncomment these four if you have mirroring issues
  40. N''DBMIRROR_DBM_EVENT'', N''DBMIRROR_EVENTS_QUEUE'',
  41. N''DBMIRROR_WORKER_QUEUE'', N''DBMIRRORING_CMD'',
  42.  
  43. N''DIRTY_PAGE_POLL'', N''DISPATCHER_QUEUE_SEMAPHORE'',
  44. N''EXECSYNC'', N''FSAGENT'',
  45. N''FT_IFTS_SCHEDULER_IDLE_WAIT'', N''FT_IFTSHC_MUTEX'',
  46.  
  47. -- Maybe uncomment these six if you have AG issues
  48. N''HADR_CLUSAPI_CALL'', N''HADR_FILESTREAM_IOMGR_IOCOMPLETION'',
  49. N''HADR_LOGCAPTURE_WAIT'', N''HADR_NOTIFICATION_DEQUEUE'',
  50. N''HADR_TIMER_TASK'', N''HADR_WORK_QUEUE'',
  51.  
  52. N''KSOURCE_WAKEUP'', N''LAZYWRITER_SLEEP'',
  53. N''LOGMGR_QUEUE'', N''MEMORY_ALLOCATION_EXT'',
  54. N''ONDEMAND_TASK_QUEUE'',
  55. N''PREEMPTIVE_XE_GETTARGETSTATE'',
  56. N''PWAIT_ALL_COMPONENTS_INITIALIZED'',
  57. N''PWAIT_DIRECTLOGCONSUMER_GETNEXT'',
  58. N''QDS_PERSIST_TASK_MAIN_LOOP_SLEEP'', N''QDS_ASYNC_QUEUE'',
  59. N''QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP'',
  60. N''QDS_SHUTDOWN_QUEUE'', N''REDO_THREAD_PENDING_WORK'',
  61. N''REQUEST_FOR_DEADLOCK_SEARCH'', N''RESOURCE_QUEUE'',
  62. N''SERVER_IDLE_CHECK'', N''SLEEP_BPOOL_FLUSH'',
  63. N''SLEEP_DBSTARTUP'', N''SLEEP_DCOMSTARTUP'',
  64. N''SLEEP_MASTERDBREADY'', N''SLEEP_MASTERMDREADY'',
  65. N''SLEEP_MASTERUPGRADED'', N''SLEEP_MSDBSTARTUP'',
  66. N''SLEEP_SYSTEMTASK'', N''SLEEP_TASK'',
  67. N''SLEEP_TEMPDBSTARTUP'', N''SNI_HTTP_ACCEPT'',
  68. N''SP_SERVER_DIAGNOSTICS_SLEEP'', N''SQLTRACE_BUFFER_FLUSH'',
  69. N''SQLTRACE_INCREMENTAL_FLUSH_SLEEP'',
  70. N''SQLTRACE_WAIT_ENTRIES'', N''WAIT_FOR_RESULTS'',
  71. N''WAITFOR'', N''WAITFOR_TASKSHUTDOWN'',
  72. N''WAIT_XTP_RECOVERY'',
  73. N''WAIT_XTP_HOST_WAIT'', N''WAIT_XTP_OFFLINE_CKPT_NEW_LOG'',
  74. N''WAIT_XTP_CKPT_CLOSE'', N''XE_DISPATCHER_JOIN'',
  75. N''XE_DISPATCHER_WAIT'', N''XE_TIMER_EVENT'')
  76. AND [waiting_tasks_count] > 0
  77. )
  78. SELECT
  79. getdate(),
  80. MAX ([W1].[wait_type]) AS [WaitType],
  81. CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S],
  82. CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S],
  83. CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S],
  84. MAX ([W1].[WaitCount]) AS [WaitCount],
  85. CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage],
  86. CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S],
  87. CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S],
  88. CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S]
  89. FROM [Waits] AS [W1]
  90. INNER JOIN [Waits] AS [W2]
  91. ON [W2].[RowNum] <= [W1].[RowNum]
  92. GROUP BY [W1].[RowNum]
  93. HAVING SUM ([W2].[Percentage]) - MAX( [W1].[Percentage] ) < 95; -- percentage threshold
  94. '
  95. );

d.在Agent 中配置Job调用c中的脚本

详情省略,可以参考数据库出现阻塞及时邮件预警提醒(下)

e.效果如下图,本地测试环境4月5日与5月4日wait statistics前后差异非常明显,4月5日存在比较明显关于CPU方面的问题。

参考资料

http://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/

SQL Server 等待统计信息基线收集的更多相关文章

  1. SQL SERVER的统计信息

    1 什么是统计信息     统计信息 描述了 表格或者索引视图中的某些列的值 的分布情况,属于数据库对象.根据统计信息,查询优化器就能评估查询过程中需要读取的行数及结果集情况,同时也能创建高质量的查询 ...

  2. SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016)

    本位出处:http://www.cnblogs.com/wy123/p/6770258.html 统计信息写过几篇了相关的文章了,感觉还是不过瘾,关于统计信息的问题,最近又踩坑了,该问题虽然不算很常见 ...

  3. SQL Server 查找统计信息的采样时间与采样比例

    有时候我们会遇到,由于统计信息不准确导致优化器生成了一个错误的执行计划(或者这样表达:一个较差的执行计划),从而引起了系统性能问题.那么如果我们怀疑这个错误的执行计划是由于统计信息不准确引起的.那么我 ...

  4. Sql Server优化---统计信息维护策略

    本位出处:http://www.cnblogs.com/wy123/p/5748933.html 首先解释一个概念,统计信息是什么: 简单说就是对某些字段数据分布的一种描述,让SQL Server大概 ...

  5. SQL Server 更新统计信息出现严重错误,应放弃任何可能产生的结果

      一台SQL Server 2008 R2版本(具体版本如下所示)的数据库,最近几天更新统计信息的作业出错,错误如下所示: Microsoft SQL Server 2008 R2 (SP2) - ...

  6. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  7. Oracle自动统计信息的收集原理及实验

    [日期:2014-11-21]来源:Linux社区  作者:stevendbaguo[字体:大 中 小] 从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATH ...

  8. [转载]sql server 等待类型

    下表列出各任务所遇到的等待类型. 等待类型 说明 ASYNC_DISKPOOL_LOCK 当尝试同步并行的线程(执行创建或初始化文件等任务)时出现. ASYNC_IO_COMPLETION 当某任务正 ...

  9. 如何有效抓取SQL Server的BLOCKING信息

    原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12 ...

随机推荐

  1. 线上MYSQL同步报错故障处理总结(转)

    前言 在发生故障切换后,经常遇到的问题就是同步报错,数据库很小的时候,dump完再导入很简单就处理好了,但线上的数据库都150G-200G,如果用单纯的这种方法,成本太高,故经过一段时间的摸索,总结了 ...

  2. Summer training #4

    D:找到两个数 一个是另一个的整数倍(1也算) 因为N是600000 调和级数为ln(n+1) 算一下 可以直接爆 #include <bits/stdc++.h> #include &l ...

  3. Hutools之http工具类

    Hutools请求网络资源使用的工具类:HttpRequest和HttpResponse Get方式请求数据 Get方式请求数据Map<String,Object> paramMap = ...

  4. Redux应用多人协作的思路和实现

    先上Demo动图,效果如下: 基本思路 由于redux更改数据是dispatch(action),所以很自然而然想到以action作为基本单位在服务端和客户端进行传送,在客户端和服务端用数组来存放ac ...

  5. nginx.conf文件的使用

    默认配置语法 全局---服务级别的配置 user 设置nginx服务的系统使用用户,基本上不用动 worker_processes 工作进程数---跟nginx多worker有关,增大连接数的并发处理 ...

  6. BZOJ 2243: [SDOI2011]染色 (树剖+线段树)

    树链剖分后两个区间合并的时候就判一下相交颜色是否相同来算颜色段数就行了. CODE #include <vector> #include <queue> #include &l ...

  7. Django后台获取不到前端axios-post请求提交的参数的解决方法

    解决方法 用 URLSearchParams 传递参数 let param = new URLSearchParams() param.append('username', 'admin') para ...

  8. Python 多线程Ⅱ

    线程模块 Python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的.原始的线程以及一个简单的锁. threading 模块提供的其他方法: threadi ...

  9. Python—数据类型之列表(List)

    列表的切片 语法:列表[:].列表[::]        综合:列表[(开始索引b):(结束索引e)(:(步长s))] 返回:列表的切片取值时,返回一个列表,规则等同于字符串切片规则. 说明: 开始索 ...

  10. golang web实战之三(基于iris框架的 web小应用,数据库采用 sqlite3 )

    一.效果:一个图片应用 1.可上传图片到uploads目录. 2.可浏览和评论图片(用富文本编辑器输入) 二.梳理一下相关知识: 1.iris框架(模板输出,session) 2.富文本编辑器.sql ...