MSSQL 쿼리 메모
1. 실행계획 텍스트
SET SHOWPLAN_ALL ON
GO
{QUERY DO}
GO
SET SHOWPLAN_ALL OFF
GO
2. 비종료 Process 확인 / LOCK 확인
SELECT
p.spid
, p.cmd
, p.status
, p.loginame
, p.hostname
, p.open_tran
, datediff(s, p.last_batch, getdate()) as [wait tims(s)]
, q.text
FROM
master.dbo.sysprocesses AS p WITH(NOLOCK)
CROSS APPLY sys.dm_exec_sql_text (p.sql_handle) AS q
WHERE
p.open_tran > 0
AND p.spid > 50
AND EXISTS ( SELECT 1 FROM master.dbo.syslockinfo WHERE req_spid = p.spid and rsc_type <> 2 )
ORDER BY datediff(s, p.last_batch, getdate()) DESC
###
sp_who2
3. 기본 SP lock 확인
EXEC sp_lock
DBCC INPUTBUFFER({PID});
항목 설명
잠금 모드
S-> 공유 잠금
U-> 업데이트 잠금
X-> 독점 잠금
IS-> 의도 공유
IU-> 의도 업데이트
IX-> 독점 의도
BU-> 대량 업데이트
잠금 유형
* RID : 행 식별자로 식별되는 테이블의 단일 행에 대한 잠금
* KEY : 직렬화 할 수 있는 트랜잭션에서 키의 범위를 보호하는 인덱스 내의 잠금
* PAG : 데이터 또는 인덱스 페이지에 대한 잠금
* EXT : 익스텐트에 대한 잠금
* TAB : 모든 데이터와 인덱스가 포함된 전체 테이블에 대한 잠금
* DB : 데이터베이스에 대한 잠금
* FIL : 데이터베이스 파일에 대한 잠금
* APP : 응용 프로그램이 지정한 리소스에 대한 잠금
* MD : 메타데이터 혹은 카탈로그 정보에 대한 잠금
* HBT : 힙 또는 B-트리 인덱스에 대한 잠금
* AU : 할당 단위에 대한 잠금
SLock 제외
SELECT
convert (smallint, req_spid) As spid,
substring (u.name, 1, 8) As Mode,
substring (v.name, 1, 4) As Type,
xname = (case when u.name like '%x%' then 1 else 0 end)
FROM master.dbo.syslockinfo,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u
WHERE master.dbo.syslockinfo.rsc_type = v.number
and v.type = 'LR'
and master.dbo.syslockinfo.req_status = x.number
and x.type = 'LS'
and master.dbo.syslockinfo.req_mode + 1 = u.number
and u.type = 'L'
AND substring (u.name, 1, 8) <> 'S'
ORDER BY xname DESC, spid ASC
4. 멈춰버린 Process 종료
kill {pid}
commit;
5. 슬로우쿼리 확인
SELECT TOP 100 SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.min_logical_reads, qs.max_logical_reads,
qs.total_elapsed_time, qs.last_elapsed_time,
qs.min_elapsed_time, qs.max_elapsed_time,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE qt.encrypted=0 AND qs.last_execution_time BETWEEN '2022-01-19 00:00:00' AND' 2022-01-19 15:59:59'
ORDER BY qs.last_execution_time DESC