背景

我们随时监控每个服务器不同时间段的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.新建库

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

b.新建表

 USE [BaselineData];
IF NOT EXISTS ( SELECT *
FROM [sys].[tables]
WHERE [name] = N'WaitStats'
AND [type] = N'U' )
CREATE TABLE [dbo].[WaitStats]
(
[RowNum] [BIGINT] IDENTITY(1, 1) ,
[CaptureDate] [DATETIME] ,
[WaitType] [NVARCHAR](120) ,
[Wait_S] [DECIMAL](14, 2) ,
[Resource_S] [DECIMAL](14, 2) ,
[Signal_S] [DECIMAL](14, 2) ,
[WaitCount] [BIGINT] ,
[Percentage] [DECIMAL](4, 2) ,
[AvgWait_S] [DECIMAL](14, 2) ,
[AvgRes_S] [DECIMAL](14, 2) ,
[AvgSig_S] [DECIMAL](14, 2)
);
CREATE CLUSTERED INDEX CI_WaitStats ON [dbo].[WaitStats] ([RowNum], [CaptureDate]);

c.查询等待统计信息

 USE [BaselineData];
INSERT INTO dbo.WaitStats
( [capturedate] ,
[WaitType]
)
VALUES ( GETDATE() ,
'Wait Statistics for ' + CAST(GETDATE() AS NVARCHAR(19))
);
INSERT INTO dbo.WaitStats
( [CaptureDate] ,
[WaitType] ,
[Wait_S] ,
[Resource_S] ,
[Signal_S] ,
[WaitCount] ,
[Percentage] ,
[AvgWait_S] ,
[AvgRes_S] ,
[AvgSig_S]
)
EXEC
( ';WITH [Waits] AS
(SELECT
[wait_type],
[wait_time_ms] / 1000.0 AS [WaitS],
([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
[signal_wait_time_ms] / 1000.0 AS [SignalS],
[waiting_tasks_count] AS [WaitCount],
100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
FROM sys.dm_os_wait_stats
WHERE [wait_type] NOT IN (
N''BROKER_EVENTHANDLER'', N''BROKER_RECEIVE_WAITFOR'',
N''BROKER_TASK_STOP'', N''BROKER_TO_FLUSH'',
N''BROKER_TRANSMITTER'', N''CHECKPOINT_QUEUE'',
N''CHKPT'', N''CLR_AUTO_EVENT'',
N''CLR_MANUAL_EVENT'', N''CLR_SEMAPHORE'', -- Maybe uncomment these four if you have mirroring issues
N''DBMIRROR_DBM_EVENT'', N''DBMIRROR_EVENTS_QUEUE'',
N''DBMIRROR_WORKER_QUEUE'', N''DBMIRRORING_CMD'', N''DIRTY_PAGE_POLL'', N''DISPATCHER_QUEUE_SEMAPHORE'',
N''EXECSYNC'', N''FSAGENT'',
N''FT_IFTS_SCHEDULER_IDLE_WAIT'', N''FT_IFTSHC_MUTEX'', -- Maybe uncomment these six if you have AG issues
N''HADR_CLUSAPI_CALL'', N''HADR_FILESTREAM_IOMGR_IOCOMPLETION'',
N''HADR_LOGCAPTURE_WAIT'', N''HADR_NOTIFICATION_DEQUEUE'',
N''HADR_TIMER_TASK'', N''HADR_WORK_QUEUE'', N''KSOURCE_WAKEUP'', N''LAZYWRITER_SLEEP'',
N''LOGMGR_QUEUE'', N''MEMORY_ALLOCATION_EXT'',
N''ONDEMAND_TASK_QUEUE'',
N''PREEMPTIVE_XE_GETTARGETSTATE'',
N''PWAIT_ALL_COMPONENTS_INITIALIZED'',
N''PWAIT_DIRECTLOGCONSUMER_GETNEXT'',
N''QDS_PERSIST_TASK_MAIN_LOOP_SLEEP'', N''QDS_ASYNC_QUEUE'',
N''QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP'',
N''QDS_SHUTDOWN_QUEUE'', N''REDO_THREAD_PENDING_WORK'',
N''REQUEST_FOR_DEADLOCK_SEARCH'', N''RESOURCE_QUEUE'',
N''SERVER_IDLE_CHECK'', N''SLEEP_BPOOL_FLUSH'',
N''SLEEP_DBSTARTUP'', N''SLEEP_DCOMSTARTUP'',
N''SLEEP_MASTERDBREADY'', N''SLEEP_MASTERMDREADY'',
N''SLEEP_MASTERUPGRADED'', N''SLEEP_MSDBSTARTUP'',
N''SLEEP_SYSTEMTASK'', N''SLEEP_TASK'',
N''SLEEP_TEMPDBSTARTUP'', N''SNI_HTTP_ACCEPT'',
N''SP_SERVER_DIAGNOSTICS_SLEEP'', N''SQLTRACE_BUFFER_FLUSH'',
N''SQLTRACE_INCREMENTAL_FLUSH_SLEEP'',
N''SQLTRACE_WAIT_ENTRIES'', N''WAIT_FOR_RESULTS'',
N''WAITFOR'', N''WAITFOR_TASKSHUTDOWN'',
N''WAIT_XTP_RECOVERY'',
N''WAIT_XTP_HOST_WAIT'', N''WAIT_XTP_OFFLINE_CKPT_NEW_LOG'',
N''WAIT_XTP_CKPT_CLOSE'', N''XE_DISPATCHER_JOIN'',
N''XE_DISPATCHER_WAIT'', N''XE_TIMER_EVENT'')
AND [waiting_tasks_count] > 0
)
SELECT
getdate(),
MAX ([W1].[wait_type]) AS [WaitType],
CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S],
CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S],
CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S],
MAX ([W1].[WaitCount]) AS [WaitCount],
CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage],
CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S],
CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S],
CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S]
FROM [Waits] AS [W1]
INNER JOIN [Waits] AS [W2]
ON [W2].[RowNum] <= [W1].[RowNum]
GROUP BY [W1].[RowNum]
HAVING SUM ([W2].[Percentage]) - MAX( [W1].[Percentage] ) < 95; -- percentage threshold
'
);

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. 【转载】Attention Mechanism in Deep Learning

    本篇随笔为转载,原文地址:知乎,深度学习中Attention Mechanism详细介绍:原理.分类及应用.参考链接:深度学习中的注意力机制. Attention是一种用于提升基于RNN(LSTM或G ...

  2. z-index无效失效的解决

    解决办法: 父级元素加上position:relative;并设置z-index父级元素的z-index优先,其中包含的元素的z-index是相对于父级元素的index <div style=& ...

  3. nginx 访问控制模块

    截图,代码截屏均引用自慕课网nginx相关教学视频 基于用户的访问控制模块 http_access_module 基于用户登录信任的模块 http_access_module 参数示意:address ...

  4. 课时5:POW,POS,DPOS(矿工/矿机,工作证明)

    比特币钱包

  5. Http 数据操作

    /// <summary> /// 上传数据参数 /// </summary> public class UploadEventArgs : EventArgs { int b ...

  6. Javascript调试技巧整理

    整理一下网上看到的实用调试技巧! 1. 不要使用alert 首先,alert只能打印出字符串,如果打印的对象不是String,则会调用toString()方法将该对象转成字符串(比如转成[object ...

  7. 灰度图像--图像增强 双边滤波 Bilateral Filtering

    学习DIP第31天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  8. Python3:Collatz 序列(考拉咨猜想)

    编写一个名为collatz()的函数,它有一个名为number的参数: 如果参数是偶数,那么collatz()就打印出number//2,并返回该值: 如果number是奇数,那么collatz()就 ...

  9. jQuery事件之一次性事件

    语法: $(selector).one(type, data, callback) 作用: (1)为每一个匹配元素的特定事件(比如click)绑定一个一次性的事件处理函数. (2)每个对象上,这个事件 ...

  10. Spring Boot教程(三十五)使用MongoDB数据库(1)

    MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有 ...