Назад | Перейти на главную страницу

Как лучше всего определить, что блокирует SQL 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

Это хорошее место для начала. Вы также должны смотреть на ожидания, используя DMV sys.dm_os_waiting_tasks, который сообщит вам, какой ресурс заставляет каждый процесс ждать.

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