有时候我们需要从sql server的实例级别,了解等待类型及其等待的时间,从而指导系统的最大瓶颈在哪儿。
我们可以通过视图 SYS.DM_OS_WAIT_STATS来获取到这些信息,视图中的字段定义:
列名 | 数据类型 | 说明 |
---|---|---|
wait_type | nvarchar(60) | 等待类型的名称。 |
waiting_tasks_count | bigint | 该等待类型的等待数。该计数器在每开始一个等待时便会增加。 |
wait_time_ms | bigint | 该等待类型的总等待时间(毫秒)。该时间包括 signal_wait_time_ms。 |
max_wait_time_ms | bigint | 该等待类型的最长等待时间。 |
signal_wait_time_ms | bigint | 正在等待的线程从收到信号通知到其开始运行之间的时差。 |
需要注意的是:
1、这个信息是汇总的,也就是在SQL Server实例中执行线程提供所有发生等待的运行总和,而非明细的。
2、每次重启之后或手动清除统计信息,那么会重新开始统计
代码如下:
SELECT TOP 10
wait_type,
wait_time_ms
FROM SYS.dm_os_wait_stats
WHERE wait_type not in
(
'LAZYWRITER_SLEEP',
'SQLTRACE_BUFFER_FLUSH',
'REQUEST_FOR_DEADLOCK_SEARCH',
'LOGMGR_QUEUE',
'CHECKPOINT_QUEUE',
'CLR_AUTO_EVENT',
'SLEEP_TASK',
'BROKER_TO_FLUSH',
'BROKER_TASK_STOP',
'WIATFOR'
)
ORDER BY wait_time_ms DESC
另外,我们可以清空当前统计的等待类型信息,可以通过自定义的时间段,提供等待类型的统计信息
DBCC SQLPERF('sys.dm_os_wait_stats',
'clear')
go