본문 바로가기
DATABASE/MsSQL

[MsSQL] 실행 했던 쿼리 실행 계획 찾기

by DANEW 2024. 11. 7.

실행 했던 쿼리 실행계획

지금 당장 실행할 쿼리의 실행계획을 알아보는거야 뭐 너무나 쉽지만
 
이미 실행되었던 쿼리들에 대해서 실행계획을 찾으려면 캐시된 쿼리들에 한하여 실행계획을 찾아 볼 수 있다.
 
SYS.DM_EXEC_QUERY_STATS 라는 시스템 뷰에 남아있는 sql_handle / plan_handle을 통해 찾아보는 쿼리에 대해 알아보자.

 

Query

select s.creation_time, 
       s.last_execution_time,
       s.execution_count,
       substring(t.text, 
                 (s.statement_start_offset/2) + 1, 
                 ((case s.statement_end_offset 
                     when -1 then datalength(t.text) 
                     else s.statement_end_offset  
                    end - s.statement_start_offset)/2) + 1) as query_text, 
       t.text,
       p.query_plan
  from SYS.DM_EXEC_QUERY_STATS s
 cross apply SYS.DM_EXEC_SQL_TEXT(s.sql_handle) t
 cross apply SYS.DM_EXEC_QUERY_PLAN(s.plan_handle) p
 where t.text like '%[찾고 싶은 쿼리]%'

 

쿼리 자체는 간단하다.
시스템 동적 관리 뷰 3가지를 조합하여 캐시되어있는 쿼리와 해당 쿼리의 텍스트, 플랜을 찾는 것이다.
 
* creation_time : 쿼리가 처음 컴파일되어 캐시 된 시간
*  last_execution_time : 쿼리가 마지막으로 실행 된 시간
*  execution_count : 캐시 된 이후 실행된 건수
*  query_text : 실행 된 쿼리 블록
*  text : 전체 쿼리
*  query_plan : 실제 실행 된 쿼리의 실행계획

 

시스템 동적 관리 뷰

 

 

sys.dm_exec_query_stats(Transact-SQL) - SQL Server

sys.dm_exec_query_stats(Transact-SQL)

learn.microsoft.com

 

SYS.DM_EXEC_QUERY_STATS는 SQL Server에 캐시된 쿼리의 집계를 알려주는 시스템 동적 관리 뷰이다.
sql_handle / plan_handle 과 같은 쿼리와 플랜을 식별하는 토큰과 쿼리블럭의 시작/종료 offset 쿼리의 실행 통계등이 담겨있다.


 

sys.dm_exec_sql_text(Transact-SQL) - SQL Server

sys.dm_exec_sql_text(Transact-SQL)

learn.microsoft.com

 

반응형

SYS.DM_EXEC_SQL_TEXT는 sql_handle을 통해 각 SQL을 식별하여 SQL 텍스트를 반환한다.
SYS.DM_EXEC_QUERY_STATS의  statement_start_offset / statement_end_offset와 조합하여 쿼리 블록을 찾을 수 있다.


 

 

sys.dm_exec_query_plan(Transact-SQL) - SQL Server

sys.dm_exec_query_plan(Transact-SQL)

learn.microsoft.com

 

SYS.DM_EXEC_QUERY_PLAN는 plan_handle을 통해 XML 형식으로 실행 계획을 반환한다.
query_plan 컬럼이 null 값 일 경우 아직 쿼리의 처리가 완료되지 않은 것 이다.



 

반응형