SQL Server: 쿼리 저장소를 사용할 수 없는 환경에서 물리적 읽기 크기가 큰 쿼리를 찾는 방법
이러한 환경에서 물리적 읽기 크기가 큰 쿼리를 찾는 방법을 생각해 보았습니다.
여기 의 블로그에서 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의 덤프를 조합해 종합적으로 판단하는 것이 좋을 것 같습니다.
Reference
이 문제에 관하여(SQL Server: 쿼리 저장소를 사용할 수 없는 환경에서 물리적 읽기 크기가 큰 쿼리를 찾는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/maaaaaaaa/items/c3a088f858e2d90b6d29텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)