SQL Server如何跟踪等待

在DMV(Dynamic Management Views,动态管理器)中,有三个函数用于查看等待的相关信息,sys.dm_exec_requests用于查看会话级信息,sys.dm_os_waiting_tasks用于查看任务级信息,sys.dm_os_wait_tasts用于显示等待时间的聚合。

1) sys.dm_exec_requests

sys.dm_exec_requests只提供会话级的相关信息,可以显示SQL Server内执行的每个请求的相关信息,如果需要获得更多的性能视图可以通过任务级进行查看,系统进程可以在没有建立会话的情况下运行任务,但相关信息并不会被显示,并且并行查询也很难进行故障诊断,因为在会话级只显示一个等待。下面的代码显示了等待信息以及当前运行在每个会话中的T-SQL。

select er.session_id,

er.database_id,

er.blocking_session_id,

er.wait_type,er.wait_time,

er.wait_resource,

syst.text

from sys.dm_exec_requests er

outer apply sys.dm_exec_sql_text(er.sql_handle) syst

查询结果如图所示。

SQL Server如何跟踪等待

2) sys.dm_os_waiting_tasks

sys.dm_os_waiting_tasks列出所有正在等待的任务,它是查看当前等待最为精确的DMV函数,它包含识别任务、关联的会话、等待的详细资料以及阻塞任务的信息,但任务只在它正在等待的期间拥有一个表项,因为sys.dm_os_waiting_tasks更多的用于交互式调查,而不是作为监控目的,可以使用报告阻塞任务的列来识别阻塞锁。下面示例脚本,通过T-SQL显示当前哪个seesion_id可用,当前运行的T-SQL的等待任务的所有信息。

select wt.*,

syst.text

from sys.dm_os_waiting_tasks wt left join sys.dm_exec_requests er

on wt.waiting_task_address = er.task_address

outer apply sys.dm_exec_sql_text(er.sql_handle) syst

order by wt.session_id

查询结果如图所示。

SQL Server如何跟踪等待

3) sys.dm_os_wait_tasts

sys.dm_os_wait_tasts用于统计聚合时间,只要SQL Server启动,即对所有查询的等待时间进行了聚合,它在监视及服务器范围内调校等方面非常理想。下面脚本示例,用于获得等待时间(CPU等待)和资源等待时间。

select signalwaittimems = sum(signal_wait_time_ms),

'%signal waits' = cast(100.0*sum(signal_wait_time_ms)/sum(wait_time_ms) as numeric(20,3)),

resourcewaittimems = sum(wait_time_ms - signal_wait_time_ms),

'%resource waits' = cast(100.0*sum(wait_time_ms - signal_wait_time_ms)/sum(wait_time_ms)as

numeric(20,3))

from sys.dm_os_wait_stats

查询结果如图所示。

SQL Server如何跟踪等待

如果在运行前希望将历史数据清空,可以使用运下脚本:

dbcc sqlperf('sys.dm_os_wait_stats',clear)

%signal waits表示信息等待时间的百分比,从列表中可以看出信息等待时间百分比非常小,表示CPU的需求相对繁重。


分享到:


相關文章: