Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
najti_prichiny_blokirovok_sql [2026/04/17 07:36] tro |
najti_prichiny_blokirovok_sql [2026/04/22 06:57] (текущий) tro |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Найти причины блокировок SQL ====== | ====== Найти причины блокировок SQL ====== | ||
| - | ===== | + | |
| + | ===== Перевірка на блокування ===== | ||
| + | ==== Розширена | ||
| < | < | ||
| - | -- Транзакції, | ||
| SELECT | SELECT | ||
| s.session_id, | s.session_id, | ||
| - | s.login_name, | ||
| s.program_name, | s.program_name, | ||
| s.host_name, | s.host_name, | ||
| - | s.status, | + | |
| - | | + | r.command, |
| - | | + | r.status, |
| - | | + | |
| - | FROM sys.dm_tran_active_transactions | + | r.wait_time/ |
| - | JOIN sys.dm_tran_session_transactions | + | |
| - | JOIN sys.dm_exec_sessions | + | -- ЧАС |
| - | LEFT JOIN sys.dm_exec_requests | + | r.total_elapsed_time/ |
| + | r.total_elapsed_time/ | ||
| + | |||
| + | -- CPU | ||
| + | r.cpu_time | ||
| + | CAST(r.cpu_time * 100.0 | ||
| + | / NULLIF(r.total_elapsed_time, | ||
| + | |||
| + | | ||
| + | r.logical_reads | ||
| + | | ||
| + | r.writes | ||
| + | -- скільки МБ прочитано з диску | ||
| + | r.reads * 8 / 1024 AS прочитано_МБ, | ||
| + | |||
| + | -- БЛОКУВАННЯ | ||
| + | r.blocking_session_id | ||
| + | r.open_transaction_count | ||
| + | |||
| + | -- ПРОГРЕС (для BACKUP, DBCC, ALTER INDEX) | ||
| + | r.percent_complete | ||
| + | r.estimated_completion_time/ | ||
| + | |||
| + | -- ПАМ' | ||
| + | mg.granted_memory_kb/ | ||
| + | mg.used_memory_kb/ | ||
| + | mg.requested_memory_kb/ | ||
| + | |||
| + | -- ПЛАН ВИКОНАННЯ (посилання) | ||
| + | r.plan_handle, | ||
| + | |||
| + | -- ТЕКСТ ЗАПИТУ | ||
| + | SUBSTRING(t.text, | ||
| + | (r.statement_start_offset/ | ||
| + | ((CASE r.statement_end_offset | ||
| + | WHEN -1 THEN DATALENGTH(t.text) | ||
| + | ELSE r.statement_end_offset | ||
| + | END - r.statement_start_offset)/ | ||
| + | ) AS поточний_оператор, | ||
| + | t.text | ||
| + | |||
| + | FROM sys.dm_exec_sessions s | ||
| + | JOIN sys.dm_exec_requests r | ||
| + | | ||
| OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t | OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t | ||
| - | WHERE DATEDIFF(SECOND, | + | LEFT JOIN sys.dm_exec_query_memory_grants mg |
| - | ORDER BY open_sec | + | ON r.session_id = mg.session_id |
| + | WHERE s.is_user_process = 1 | ||
| + | ORDER BY r.cpu_time DESC, r.logical_reads | ||
| </ | </ | ||
| - | ===== Пошук що саме робить проблемна сесія (в прикладі номер 62) ===== | + | |
| - | < | + | ==== Показує всі |
| - | SELECT r.session_id, | + | |
| - | | + | |
| - | | + | |
| - | FROM sys.dm_exec_requests r | + | |
| - | CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t | + | |
| - | WHERE r.session_id = 62 | + | |
| - | </ | + | |
| - | ===== Вбити проблемний процес ===== | + | |
| - | < | + | |
| - | KILL 58 | + | |
| - | </ | + | |
| - | ===== Перевірка на блокування взагалі | + | |
| < | < | ||
| SELECT session_id, wait_type, blocking_session_id | SELECT session_id, wait_type, blocking_session_id | ||
| Строка 52: | Строка 85: | ||
| ORDER BY r.wait_time DESC | ORDER BY r.wait_time DESC | ||
| </ | </ | ||
| - | ===== Перевірка Хто кого блокує + деталі винуватця | + | ==== Перевірка Хто кого блокує + деталі винуватця ==== |
| < | < | ||
| SELECT | SELECT | ||
| Строка 69: | Строка 102: | ||
| ORDER BY r.wait_time DESC | ORDER BY r.wait_time DESC | ||
| </ | </ | ||
| + | |||
| + | ===== Довгі відкриті транзакції (типова причина в 1С) ===== | ||
| + | < | ||
| + | -- Транзакції, | ||
| + | SELECT | ||
| + | s.session_id, | ||
| + | s.login_name, | ||
| + | s.program_name, | ||
| + | s.host_name, | ||
| + | s.status, | ||
| + | DATEDIFF(SECOND, | ||
| + | at.transaction_begin_time, | ||
| + | t.text AS last_query | ||
| + | FROM sys.dm_tran_active_transactions | ||
| + | JOIN sys.dm_tran_session_transactions | ||
| + | JOIN sys.dm_exec_sessions | ||
| + | LEFT JOIN sys.dm_exec_requests | ||
| + | OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t | ||
| + | WHERE DATEDIFF(SECOND, | ||
| + | ORDER BY open_sec DESC; | ||
| + | </ | ||
| + | ===== Пошук що саме робить проблемна сесія (в прикладі номер 62) ===== | ||
| + | < | ||
| + | SELECT r.session_id, | ||
| + | | ||
| + | | ||
| + | FROM sys.dm_exec_requests r | ||
| + | CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t | ||
| + | WHERE r.session_id = 62 | ||
| + | </ | ||
| + | ===== Вбити проблемний процес ===== | ||
| + | < | ||
| + | KILL 58 | ||
| + | </ | ||
| + | ===== Перевірка навантаження дискової підсистеми ===== | ||
| + | < | ||
| + | SELECT | ||
| + | DB_NAME(vfs.database_id) AS база, | ||
| + | mf.physical_name AS файл, | ||
| + | vfs.io_stall_read_ms / NULLIF(vfs.num_of_reads, | ||
| + | AS середня_затримка_читання_мс, | ||
| + | vfs.io_stall_write_ms / NULLIF(vfs.num_of_writes, | ||
| + | AS середня_затримка_запису_мс, | ||
| + | vfs.num_of_reads AS читань, | ||
| + | vfs.num_of_writes AS записів, | ||
| + | vfs.io_stall AS загальна_затримка_мс | ||
| + | FROM sys.dm_io_virtual_file_stats(NULL, | ||
| + | JOIN sys.master_files mf | ||
| + | ON vfs.database_id = mf.database_id | ||
| + | AND vfs.file_id = mf.file_id | ||
| + | WHERE DB_NAME(vfs.database_id) IN (' | ||
| + | ORDER BY vfs.io_stall DESC | ||
| + | </ | ||
| + | |||