使用查询来确定什么是lockingSQL Server的最佳方法是什么?

最近我们的SQL Server陷入了一些东西。 我想知道什么是通过查询数据库来检查可能导致问题的最佳方法。 这是迄今为止我所发现的最好的:

SELECT SPID = s.spid , BlockingSPID = s.blocked , DatabaseName = DB_NAME(s.dbid) , ProgramName = s.program_name , [Status] = s.[status] , LoginName = s.loginame , ObjectName = OBJECT_NAME(objectid, s.dbid) , [Definition] = CAST([text] AS VARCHAR(MAX)) FROM sys.sysprocesses s CROSS APPLY sys.dm_exec_sql_text (sql_handle) WHERE s.spid > 50 ORDER BY DatabaseName , loginName 

这是一个很好的开始。 您还应该使用sys.dm_os_waiting_tasks DMV来查看等待,这将告诉您哪些资源正在导致每个进程等待。

 select wait_type, sum(wait_duration_ms) sum_wait_duration_ms, avg(wait_duration_ms) avg_wait_duration_ms, count(*) waits from sys.dm_os_waiting_tasks group by wait_type