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가 많이 발생하고 금방 끝날 것 같지 않는 쿼리는 죽이는 것이 아무래도 안전하다.
단 하나의 쿼리 때문에 여러 사람들의 응답이 늦춰지는 것은 바람직하지 않기 때문이다.
'Programming > MSSQL' 카테고리의 다른 글
MSSQL 날짜 변환 (DATE CONVERT) (122) | 2018.04.24 |
---|---|
MSSQL 데이터 타입 크기 (DATA TYPE SIZE) (120) | 2018.04.24 |
MSSQL 자리수 만큼 앞에 0 붙이기 (함수로 구현) (0) | 2018.04.21 |
MSSQL 날짜 포맷 변환 CONVERT (0) | 2018.04.21 |
MSSQL 날짜 계산 함수 DATEADD, DATEDIFF (0) | 2018.04.21 |