SQL Server 운영

[MSSQL] 21. DMV를 활용하여 자주 쓰는 스크립트 만들기

Spiritup_91 2021. 2. 16. 00:03

13번에서 DMV를 소개했지만 다시 한번 공부해보고자 정리!

 

DMV를 활용해서 직접 확인하는 경우도 있지만

보통은 스크립트로 저장해서 필요할때마다 확인하는 경우가 많은 것 같다.(나의 경우..)

DMV 개수도 많고 외워두면 편하긴 하지만 필요할때마다 일일히 짜기도 귀찮기도해서

몇가지 자주쓰는 스크립트로 DMV를 활용할 수 있도록 만들어 두는 것이 좋을 것 같다.

(사실 노트북에 있는데 귀찮아서 찾아보고 공부!!)

출처는 구글링을 통해 여기저기서 가져오고 필요한것과 필요없는것을 수정하는 방식으로...

 

(1) CPU 소모량이 많은 Stored Procedure 찾기

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT db_name(C.dbid) AS DBName 
       ,object_schema_name(C.objectid,dbid) AS SchemaName 
       ,object_name(C.objectid,dbid) AS StoredProcedure 
       ,sum(B.execution_count) AS Execution_count 
       ,sum(B.total_worker_time) AS total_cpu_time 
       ,sum(B.total_worker_time) / (sum(B.execution_count) * 1.0) AS avg_cpu_time 
FROM sys.dm_exec_cached_plans AS A
JOIN sys.dm_exec_query_stats  AS B on A.plan_handle=B.plan_handle
CROSS APPLY sys.dm_exec_sql_text(A.plan_handle)  AS C
WHERE db_name(C.dbid) is not null and A.objtype='proc'
GROUP BY db_name(C.dbid), object_schema_name(objectid,C.dbid), object_name(objectid,C.dbid)
ORDER BY sum(B.total_worker_time) DESC
 
cs

 

 

(2) 비용이 드는 쿼리 찾기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT TOP 20   
       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) AS 수행쿼리,  
        qs.execution_count              AS 쿼리계획이_마지막컴파일후_실행횟수,  
        qs.total_logical_reads          AS 쿼리계획이_컴파일후_실행될때_수행한_총논리적읽기수,  
        qs.last_logical_reads           AS 마지막_수행한_논리적읽기수,  
        qs.total_logical_writes         AS 쿼리계획이_컴파일후_실행될때_수행한_총논리적쓰기수,   
        qs.last_logical_writes          AS 마지막_수행한_논리적쓰기수,  
        qs.total_worker_time            AS [쿼리계획이_컴파일후_실행될때_사용된_총CPU시간(마이크로초)],   
        qs.last_worker_time             AS [마지막_실행될때_사용된_CPU시간(마이크로초)],  
        qs.total_elapsed_time/1000000     AS [실행완료하는데 소요된 총 경과시간(마이크로초)_초로변환],  
        qs.last_elapsed_time/1000000     AS [최근 실행완료하는데 소요된 경과시간(마이크로초)_초로변환],  
        qs.last_execution_time AS 해당쿼리가_마지막으로_실행된_시간 
  FROM       sys.dm_exec_query_stats AS qs 
  CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
  CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp  
  ORDER BY    qs.last_worker_time DESC    
 
cs

 

 

(3) 쿼리계획에 대한 요약 성능 확인

읽기, 쓰기, 총 행, 완료 시간, 계획 해시, 메모리 부여 정보, 스레드, 열 저장소 통계, 유출 및 병렬 처리 정도와 같은 단일 계획에 연결된 통계

 

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT TOP 5 
      query_stats.query_hash AS "Query Hash",  
      SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",  
      MIN(query_stats.statement_text) AS "Statement Text"   
FROM (SELECT QS.*,   
            SUBSTRING(ST.text, (QS.statement_start_offset/2+ 1,  
            ((CASE statement_end_offset
              WHEN -1 THEN DATALENGTH(ST.text)  
              ELSE QS.statement_end_offset END  - QS.statement_start_offset)/2+ 1) AS statement_text  
FROM sys.dm_exec_query_stats AS QS   
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats 
GROUP BY query_stats.query_hash   
ORDER BY 2 DESC;  
cs

 

더 만들어보기.....~!!