SQL Server: 쿼리 저장소를 사용할 수 없는 환경에서 물리적 읽기 크기가 큰 쿼리를 찾는 방법

5138 단어 SQLServerDB
쿼리 스토어를 사용할 수 있으면 끝나는 이야기입니다만, 버전 등의 관계로 쿼리 스토어를 사용할 수 없는 경우도 있다고 생각합니다.
이러한 환경에서 물리적 읽기 크기가 큰 쿼리를 찾는 방법을 생각해 보았습니다.

여기 의 블로그에서 dm_exec_requests 덤프를 정기적으로 취하여 물리적 읽기 크기가 큰 쿼리를 찾는 방법을 소개했습니다.

다만, 이쪽의 쿼리라면, 「병렬 실행으로 물리 읽기 계속해, 읽기가 끝난 순간에 처리가 끝나는 것과 같은 쿼리」에 대해서는 검출하기 어렵습니다.

↓ 블로그에서 소개된 방법을 사용하여 5초 간격으로 sys.dm_exec_requests를 덤프한 결과입니다.

CXPACKET 대기하고 있는 상태에서는 reads가 카운트 업되지 않기 때문에, ①에서 ④의 쿼리는 모두 reads=0인 채로 되어 있습니다.

그러나 비슷한 쿼리를 sys.dm_exec_query_stats에서 검색하면 상당히 많은 양의 물리적 읽기를 수행했음을 알 수 있습니다.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 100
  DB_NAME(qt.dbid) as database_name
  --query text
  ,qt.TEXT as parent_query
  ,SUBSTRING(qt.TEXT, qs.statement_start_offset / 2, (
      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 statement
  -- total
  ,total_worker_time / 1000 as total_CPU_time_ms
  ,total_elapsed_time / 1000 as total_duration_ms
  ,total_physical_reads as total_physical_reads
  ,total_physical_reads * 8 / 1024 / 1024 as total_physical_reads_gb
  ,execution_count
  ,last_execution_time
FROM sys.dm_exec_query_stats qs
OUTER APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt -- クエリテキスト用
ORDER BY total_physical_reads / execution_count desc

↓ 수십GB의 물리 읽기가 발생하고 있는 것도.


그럼, dm_exec_query_stats만 취득하면 되는 것은, 라고 하는 이야기가 됩니다만,
・캐시 아웃되면 NG(환경에 따라서는 수 10초로 캐쉬 아웃할 가능성도)
· 완료된 것 만 저장됩니다.
라는 조건이 있습니다.

그러므로
dm_exec_requests와 dm_exec_query_stats의 덤프를 조합해 종합적으로 판단하는 것이 좋을 것 같습니다.

좋은 웹페이지 즐겨찾기