SQL Server/SQL Server 자주보는

[MSSQL] 플랜캐시에 있는 실행계획 확인하는 방법

꽁담 2020. 2. 9. 22:30

플랜캐시 & 실행계획


SQL Server는 한번 실행된 쿼리는 처음 만들어진 실행계획을 플랜캐시에 등록하여 이후에 재사용합니다.

특정 조건을 만족하여 쿼리의 실행계획이 재 컴파일 되기 전까지는 말이죠.


실행계획이 재 컴파일 되어 새로운 실행계획이 만들어지는경우 기존의 실행계획은 삭제되어 확인할 수 없습니다.


그럼 현재 플랜캐시에 있는 실행계획을 확인해 보도록 하겠습니다.

플랜캐시에서는 아래와 같은 정보를 확인할 수 있습니다.

- 쿼리 구문

- 수행 횟수

- CPU 시간

- 수행 시간

- 논리적 읽기

- 논리적 쓰기

- 쿼리 플랜


현재 플랜캐시에 있는 실행계획을 확인하는 쿼리


21, 22 라인의 조건을 기호에 맞게 수정하여 특정 데이터베이스에서 특정 시간에 생성된 실행 계획을 확인할 수 있습니다.

주석처리를 하여 전체 실행계획을 출력할 수도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT
        databases.name,
      dm_exec_query_stats.sql_handle,
      dm_exec_query_stats.plan_handle,
        dm_exec_sql_text.text AS TSQL_Text,
        dm_exec_query_stats.creation_time, 
        dm_exec_query_stats.last_execution_time,
        dm_exec_query_stats.execution_count,
        dm_exec_query_stats.total_worker_time AS total_cpu_time,
        dm_exec_query_stats.total_elapsed_time, 
        dm_exec_query_stats.total_logical_reads, 
        dm_exec_query_stats.last_logical_reads,
        dm_exec_query_stats.total_logical_writes,
        dm_exec_query_stats.last_logical_writes,
        dm_exec_query_plan.query_plan
FROM sys.dm_exec_query_stats WITH(NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(dm_exec_query_stats.plan_handle)
CROSS APPLY sys.dm_exec_query_plan(dm_exec_query_stats.plan_handle)
INNER JOIN sys.databases WITH(NOLOCK)
ON dm_exec_sql_text.dbid = databases.database_id
AND databases.name = 'AdventureWorks'
AND dm_exec_query_stats.sql_handle IN ( SELECT dm_exec_query_stats.sql_handle
                                          FROM sys.dm_exec_query_stats WITH(NOLOCK)
                                         WHERE dm_exec_query_stats.creation_time >= '2020-01-13 12:34:45'
                                           AND dm_exec_query_stats.creation_time <= '2020-01-13 12:34:46')
ORDER BY dm_exec_query_stats.sql_handle, dm_exec_query_stats.creation_time
OPTION (MAXDOP 1)
 
cs