MSSQL CPU 사용율 높은 쿼리 찾기/락걸린 SQL 찾아보기

2025. 12. 2. 18:16·Programming/Database

CPU 사용율 높은 쿼리 찾기

USE master
SELECT TOP 10 
       REPLACE(CONVERT(VARCHAR(20), CONVERT(MONEY,qs.total_worker_time / qs.execution_count/1000),1),'.00','') as [Avg CPU Time(ms)]
      ,qs.execution_count
      ,substring (qt.text,
                  qs.statement_start_offset/2+1,
                  (case when qs.statement_end_offset = -1 then len (convert (nvarchar(max), qt.text)) * 2
                        else qs.statement_end_offset end - qs.statement_start_offset)/2) as query_text
      ,qt.dbid
      ,sd.name
      ,qt.objectid
      ,qt.number
      ,qt.encrypted
      ,qt.text
      ,sr.session_id
      ,sr.command
      ,sr.status
      ,sr.last_wait_type
      ,sr.wait_resource
      ,sq.query_plan
      ,fs.text
  FROM sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt 
       CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) as sq
       LEFT OUTER JOIN sys.databases as sd on qt.dbid = sd.database_id
       LEFT OUTER JOIN sys.dm_exec_requests as sr on qs.sql_handle = sr.sql_handle
       OUTER APPLY sys.fn_get_sql(sr.sql_handle) AS fs       
 ORDER BY qs.total_worker_time / qs.execution_count DESC
GO

 

Lock 걸린 SQL 찾기

DB와 연계된 프로그램을 작성하다
보면 가끔씩 Lock 이 걸리는 형상을 발견하게 됩니다.
sp_lock 라는 명령어가 있지만 그건만으로는
좀 부족하죠 그래서 Lock 걸린 문장을 찾는 방법을 소개합니다.

declare @spid int = 0

select top 1 @spid = spid --, dbid, ObjId, IndId, Type, Resource, Mode, Status
from (
select convert (smallint, req_spid) As spid,
  rsc_dbid As dbid,
  rsc_objid As ObjId,
  rsc_indid As IndId,
  substring (v.name, 1, 4) As Type,
  substring (rsc_text, 1, 32) as Resource,
  substring (u.name, 1, 8) As Mode,
  substring (x.name, 1, 5) As Status

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') a where a.Mode = 'X'
group by spid --, dbid, ObjId, IndId, Type, Resource, Mode, Status

PRINT '@spid > ' + CONVERT(VARCHAR(5), @spid)

if @SPID > 0
begin
  DBCC INPUTBUFFER(@spid)
end

 

spid >0 이라고 나오면 락걸린 쿼리가 없다는거고
DBCC INPUTBUFFER(@spid) 이 실행되면서 SQL 정보가 나오면
표시된 SQL에서 락이 걸린것임

'Programming > Database' 카테고리의 다른 글

MSSQL 서버 테이블 수정하기/자동증가값 초기화/패스워드 암호화 하기  (0) 2025.12.20
MSSQL 함수 구현 #1 (문자 앞에 0을 붙이는 함수)  (0) 2025.12.19
[MySQL] SQL 배치 작업 하기  (0) 2025.12.19
MSSQL 특정 테이블/문자를 사용하는 프로시져 찾기  (0) 2025.11.29
'Programming/Database' 카테고리의 다른 글
  • MSSQL 서버 테이블 수정하기/자동증가값 초기화/패스워드 암호화 하기
  • MSSQL 함수 구현 #1 (문자 앞에 0을 붙이는 함수)
  • [MySQL] SQL 배치 작업 하기
  • MSSQL 특정 테이블/문자를 사용하는 프로시져 찾기
레이조(RayCho)
레이조(RayCho)
개발자 레이조(RayCho)의 블로그입니다. 똑똑하게 배우고 기록하는 공간
  • 레이조(RayCho)
    레이(Ray)의 개발이야기
    레이조(RayCho)
  • 전체
    오늘
    어제
    • 분류 전체보기 (54) N
      • Programming (54) N
        • Python (5)
        • Flutter (4)
        • Delphi (20) N
        • Lazarus (1)
        • C#.NET (6) N
        • ASP.NET (5)
        • Database (5)
        • Game Dev (0)
        • Web (5)
        • ETC (3)
      • Homebrew (0)
  • 블로그 메뉴

    • 홈
    • Introduce
    • 태그
    • 방명록
  • 링크

    • Naver Blog
    • Diary Blog
  • 공지사항

  • 인기 글

  • 태그

    iis
    문법
    VCL
    웹프로그래밍
    JSON
    델파이
    강좌
    ASP.NET
    소스코드
    기초
    Python
    Web
    delphi
    SQL
    Flutter
    개발환경
    프로그래밍
    objectpascal
    C#
    mssql
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
레이조(RayCho)
MSSQL CPU 사용율 높은 쿼리 찾기/락걸린 SQL 찾아보기
상단으로

티스토리툴바