1 way of fetching high cpu queries
-- top 10 queries by worker time
SELECT TOP 10
[qs].[last_worker_time],
[qs].[max_worker_time],
[qs].[total_worker_time],
[qs].[execution_count],
stmt_start = [qs].[statement_start_offset],
stmt_end = [qs].[statement_end_offset],
[qt].[dbid],
[qt].[objectid],
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
FROM [sys].[dm_exec_query_stats] qs
CROSS APPLY [sys].dm_exec_sql_text AS qt
ORDER BY [qs].[total_worker_time] DESC; --- i.e. cpu time in microsecs
Alternate way,
--- I am grouping the queries by query hash and based on that i am getting total worker time
SELECT [qs].[last_worker_time],
[qs].[max_worker_time],
[qs].[total_worker_time],
[qs].[execution_count],
stmt_start = [qs].[statement_start_offset],
stmt_end = [qs].[statement_end_offset],
[qt].[dbid],
[qt].[objectid],
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
FROM [sys].[dm_exec_query_stats] qs
CROSS APPLY [sys].dm_exec_sql_text AS qt
ORDER BY [qs].[total_worker_time] DESC;
-- Plug in query hash
SELECT 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,
[qs].[total_worker_time],
[qs].[execution_count],
[qs].[query_hash],
[qs].[query_plan_hash]
FROM [sys].[dm_exec_query_stats] qs
CROSS APPLY [sys].dm_exec_sql_text AS qt
WHERE [qs].[query_hash] = 0x88B8B513764CB9F4C;
Question here, how can I know in which stored procedure these sql stmts are being used and what parameter values being used at runtime ?