1. 简介
在MSSQL数据库中,运行事件是指当一个会话(Sessions)进入某个等待状态后,等待过程中发生的一种事件,可以理解为数据库中出现的一种故障。这些事件会对数据库的性能和可用性产生影响,因此及时统计和回顾这些事件就显得尤为重要。
2. 统计上月运行事件
2.1 获取上月开始和结束时间
在统计上月运行事件之前,首先需要获取上月的开始时间和结束时间。以下是一个获取上月开始和结束时间的SQL代码:
DECLARE @startOfMonth DATE, @endOfMonth DATE;
SET @startOfMonth = DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()) - 31;
SET @endOfMonth = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0));
解析:该代码首先获取本月的第一天,再减去31天,即可得到上月的第一天,从而获取上月的开始时间;而获取上月的结束时间则是先获取本月的第一天,再减去1秒。在实际使用时,只需要将以上代码中的"GETDATE()"转换成需要统计的月份即可。
2.2 统计上月运行事件
在获取上月开始和结束时间之后,就可以开始统计上月的运行事件了。以下是一个统计上月运行事件的SQL代码:
SELECT
wait_type,
COUNT(*) AS [waiting_tasks_count],
SUM(wait_time_ms) AS [total_wait_time_ms],
AVG(wait_time_ms) AS [avg_wait_time_ms],
MAX(wait_time_ms) AS [max_wait_time_ms],
SUM(signal_wait_time_ms) AS [total_signal_wait_time_ms],
AVG(signal_wait_time_ms) AS [avg_signal_wait_time_ms],
MAX(signal_wait_time_ms) AS [max_signal_wait_time_ms],
STDEV(wait_time_ms) AS [wait_time_ms_stdev],
STDEV(signal_wait_time_ms) AS [signal_wait_time_ms_stdev]
FROM sys.dm_os_waiting_tasks
WHERE wait_time_ms > 0
AND wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK',
'SQLTRACE_BUFFER_FLUSH','WAITFOR','LOGMGR_QUEUE','CHECKPOINT_QUEUE','REQUEST_FOR_DEADLOCK_SEARCH',
'XE_TIMER_EVENT','BROKER_TO_FLUSH','BROKER_TASK_STOP','CLR_MANUAL_EVENT','CLR_AUTO_EVENT',
'DISPATCHER_QUEUE_SEMAPHORE', 'FT_IFTS_SCHEDULER_IDLE_WAIT', 'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN')
AND wait_type NOT LIKE 'WAITFOR%'
AND wait_type NOT LIKE 'EXECUTION%'
AND wait_type NOT LIKE 'HADR%'
AND wait_type NOT LIKE 'PWAIT%'
AND wait_type NOT LIKE 'QDS%'
AND wait_type NOT LIKE 'TRACEWRITE%'
AND wait_type NOT LIKE 'WAIT%'
GROUP BY wait_type
ORDER BY total_wait_time_ms DESC
解析:该代码将从系统DMV(动态管理视图)sys.dm_os_waiting_tasks
中获取上个月等待时间超过0(ms)的等待类型信息,并统计每种等待类型的等待任务数、总等待时间、平均等待时间、最大等待时间、总信号等待时间、平均信号等待时间、最大信号等待时间、等待时间标准差、信号等待时间标准差。从结果的total_wait_time_ms
字段中可以看出,等待IO是导致SQL Server性能问题的最大的原因之一。
3. 总结
及时回顾上月的运行事件,并统计出导致性能问题的原因,可以帮助DBA识别并处理潜在的问题,从而提高数据库的性能和可用性。