Hi All,
While capturing expensive queries by CPU or IO, why it is important to group queries by query_hash and then tune them instead of directly pulling top 10 queries from sys.dm_exec_query_stats DMV?.
What am I missing ? is it wrong way to capture expensive queries> if so, I want to understand why?
please share your thoughts.
For example, I want top 10 I/O driving queries
--way1:direct method
SELECT top 10
qs.execution_count,
qs.min_logical_reads,
qs.max_logical_reads,
(qs.total_logical_reads/qs.execution_count) AS AvgLogicalReads,
qs.min_elapsed_time,
qs.max_elapsed_time,
(qs.total_elapsed_time/qs.execution_count) AS AvgElapsedTime,
OBJECT_NAME(st.objectid, st.dbid) AS ObjectName,
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 qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
order by qs.total_logical_reads desc;
--way2:using query_hash
SELECT TOP 10
[qs].[query_hash],
SUM([qs].[total_logical_reads]) total_logical_reads,
SUM([qs].[execution_count]) total_execution_count
FROM [sys].[dm_exec_query_stats] qs
CROSS APPLY [sys].[dm_exec_sql_text]([qs].[sql_handle]) AS qt
GROUP BY [qs].[query_hash]
--HAVING SUM([qs].[execution_count]) > 100
ORDER BY SUM([qs].[total_logical_reads]) DESC;
Regards,
Sam