najti_prichiny_blokirovok_sql

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

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