IT/Windows

MSSQL 현재 실행중인 쿼리, LOCK 세션, ACTIVE 세션, KILL 세션

알콩달콩아빠 2023. 3. 6. 11:06
728x90
반응형

MSSQL DBA라면 DB 서버가 갑자기 CPU가 튀거나 메모리를 많이 차지하는 쿼리를 찾아서 KILL 시켜야 하는 경우가 있다.

운영 DB인 경우에는 KILL시키기는 조금 애매하지만 OLAP 같은 BACK 단 서비스의 경우에는 가차없이 KILL을 시켜서 서비스의 품질을 높이는 것이 먼저라고 생각한다.

 

다음은 MSSQL에서 현재 실행중인 쿼리를 찾는 쿼리이다.

 

현재 실행중인 쿼리

현재 수행중인 쿼리를 찾아서 어떠한 쿼리가 날아가고 있는지만 확인해도 DBA라면 대충은 무거운 쿼리인지 얼마나 걸릴 쿼리인지, 죽여야할 쿼리인지 정도는 예측할 수 있다, 따라서 현재 실행중인 쿼리를 찾아 먼저 어떤 쿼리인지 확인 하는 것이 중요하다.

 

SELECT 

   sqltext.TEXT,

   req.session_id,

   req.status,

   req.command,

   req.cpu_time,

   req.total_elapsed_time

FROM sys.dm_exec_requests req

CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext 

 

LOCK 쿼리 찾기

어떠한 이유에서든 LOCK가 걸린 쿼리를 찾는 쿼리이다. 아무래도 다른 트랜잭션에 의해 참조되고 있어서 LOCK이 걸렸을 경우가 높다.

이런 경우에는 원인을 빠르게 찾아 KILL을 시킬 것인지 안시킬 것인지 파악하는 것이 중요하다.

 

SELECT DISTINCT

        name AS database_name,

        session_id,

        host_name,

        login_time,

        login_name,

        reads,

        writes        

FROM    sys.dm_exec_sessions

        LEFT OUTER JOIN sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id

        INNER JOIN sys.databases ON sys.dm_tran_locks.resource_database_id = sys.databases.database_id

WHERE   resource_type <> 'DATABASE'

AND request_mode LIKE '%X%'

AND name ='DATABASE NAME'

ORDER BY name 

 

위에서 찾은 현재 실행중인 쿼리에서 무거운 쿼리나 쓸모없는 쿼리의 세션을 KILL시키도록 하자.

 

현재 붙어있는 세션 KILL 하기

KILL SID

KILL SID는 아무래도 사용자의 세션을 KILL하는 것이기 때문에 조심해야할 것이다. 하지만 이유가 분명하다면 KILL을 하는 것이 당연하다.

 

 

현재 ACTIVE 한 쿼리 찾는 쿼리

SELECT DISTINCT

        name AS database_name,

        session_id,

        host_name,

        login_time,

        login_name,

        reads,

        writes

FROM    sys.dm_exec_sessions

        LEFT JOIN sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id

        JOIN sys.databases ON sys.dm_tran_locks.resource_database_id = sys.databases.database_id

WHERE resource_type <> 'DATABASE'

AND name ='DATABASE NAME'

ORDER BY name

 

보통은 현재 실행중이면서 IO가 많이 발생하고 금방 끝날 것 같지 않는 쿼리는 죽이는 것이 아무래도 안전하다.

단 하나의 쿼리 때문에 여러 사람들의 응답이 늦춰지는 것은 바람직하지 않기 때문이다.

 

출처 : MSSQL 현재 실행중인 쿼리, LOCK 세션, ACTIVE 세션, KILL 세션 (tistory.com)

728x90
반응형