最近我们的 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
答案1
这是一个很好的起点。您还应该使用 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