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