Загрузка данных


USE master;
SET NOCOUNT ON;

-- 1. Активные запросы в наших БД и соединения репликации.
SELECT
    GETDATE() AS checkedAt,
    r.session_id,
    s.program_name,
    s.login_name,
    s.host_name,
    DB_NAME(r.database_id) AS databaseName,
    r.status,
    r.command,
    r.blocking_session_id,
    r.wait_type,
    r.wait_time AS waitMs,
    r.wait_resource,
    r.total_elapsed_time AS elapsedMs,
    r.cpu_time AS cpuMs,
    r.reads,
    r.logical_reads,
    r.writes,
    r.open_transaction_count,
    SUBSTRING(
        txt.text,
        r.statement_start_offset / 2 + 1,
        (
            CASE
                WHEN r.statement_end_offset = -1
                    THEN DATALENGTH(txt.text)
                ELSE r.statement_end_offset
            END - r.statement_start_offset
        ) / 2 + 1
    ) AS currentStatement,
    txt.text AS batchText
FROM sys.dm_exec_requests AS r
JOIN sys.dm_exec_sessions AS s
    ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS txt
WHERE r.session_id <> @@SPID
  AND
  (
      r.database_id IN
      (
          DB_ID(N'myNewVasya'),
          DB_ID(N'replTransVas'),
          DB_ID(N'distribution')
      )
      OR s.program_name LIKE N'%Distribution%'
      OR s.program_name LIKE N'%LogReader%'
      OR s.program_name LIKE N'%Replication%'
  )
ORDER BY
    CASE WHEN r.blocking_session_id > 0 THEN 0 ELSE 1 END,
    r.total_elapsed_time DESC;

-- 2. Кто блокирует запросы.
-- Показывает также спящие соединения с открытой транзакцией.
SELECT
    blocked.session_id AS blockedSession,
    DB_NAME(blocked.database_id) AS blockedDatabase,
    blocked.wait_type,
    blocked.wait_time AS waitMs,
    blocked.wait_resource,
    blocked.blocking_session_id AS blockerSession,
    blocker.status AS blockerStatus,
    blocker.login_name AS blockerLogin,
    blocker.host_name AS blockerHost,
    blocker.program_name AS blockerProgram,
    blocker.open_transaction_count AS blockerOpenTransactions,
    blocker.last_request_start_time,
    blocker.last_request_end_time,
    blockerSql.text AS blockerCurrentOrLastBatch
FROM sys.dm_exec_requests AS blocked
LEFT JOIN sys.dm_exec_sessions AS blocker
    ON blocker.session_id = blocked.blocking_session_id
LEFT JOIN sys.dm_exec_requests AS blockerRequest
    ON blockerRequest.session_id = blocked.blocking_session_id
LEFT JOIN sys.dm_exec_connections AS blockerConnection
    ON blockerConnection.session_id = blocked.blocking_session_id
OUTER APPLY sys.dm_exec_sql_text(
    COALESCE(
        blockerRequest.sql_handle,
        blockerConnection.most_recent_sql_handle
    )
) AS blockerSql
WHERE blocked.blocking_session_id > 0
  AND blocked.session_id <> @@SPID
ORDER BY blocked.wait_time DESC;

-- 3. Открытые транзакции в реплике.
SELECT
    st.session_id,
    s.login_name,
    s.host_name,
    s.program_name,
    s.status,
    at.transaction_begin_time,
    at.transaction_type,
    at.transaction_state,
    dt.database_transaction_log_bytes_used,
    dt.database_transaction_log_bytes_reserved
FROM sys.dm_tran_database_transactions AS dt
JOIN sys.dm_tran_active_transactions AS at
    ON at.transaction_id = dt.transaction_id
LEFT JOIN sys.dm_tran_session_transactions AS st
    ON st.transaction_id = dt.transaction_id
LEFT JOIN sys.dm_exec_sessions AS s
    ON s.session_id = st.session_id
WHERE dt.database_id = DB_ID(N'replTransVas')
ORDER BY at.transaction_begin_time;