diff --git a/PERFS - poor queries.sql b/PERFS - poor queries.sql new file mode 100644 index 0000000..2bfd07d --- /dev/null +++ b/PERFS - poor queries.sql @@ -0,0 +1,152 @@ +SELECT TOP 100 + 'longest query' AS msg, + GETDATE() AS [Collection Date], + [qs].[execution_count] AS [Execution Count], + SUBSTRING( + [qt].[text], + [qs].[statement_start_offset] / 2 + 1, + (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 [Query Text], + DB_NAME([qt].[dbid]) AS [DB Name], + [qs].[total_worker_time] AS [Total CPU Time], + [qs].[total_worker_time] / [qs].[execution_count] AS [Avg CPU Time (ms)], + [qs].[total_physical_reads] AS [Total Physical Reads], + [qs].[total_physical_reads] / [qs].[execution_count] AS [Avg Physical Reads], + [qs].[total_logical_reads] AS [Total Logical Reads], + [qs].[total_logical_reads] / [qs].[execution_count] AS [Avg Logical Reads], + [qs].[total_logical_writes] AS [Total Logical Writes], + [qs].[total_logical_writes] / [qs].[execution_count] AS [Avg Logical Writes], + [qs].[total_elapsed_time] AS [Total Duration], + [qs].[total_elapsed_time] / 1000000.0 AS [Total Duration seconds], + [qs].[total_elapsed_time] / [qs].[execution_count] / 1000000.0 AS [Avg Duration seconds], + [qp].[query_plan] AS [Plan], + [qs].[creation_time], + [qs].[last_execution_time] +FROM [sys].[dm_exec_query_stats] AS [qs] + CROSS APPLY [sys].dm_exec_sql_text([qs].[sql_handle]) AS [qt] + CROSS APPLY [sys].dm_exec_query_plan([qs].[plan_handle]) AS [qp] +WHERE +--/* most often used */ [qs].[execution_count] > 50 +--/* most CPU intensive */ [qs].[total_worker_time] / [qs].[execution_count] > 100 --[Avg CPU Time (ms)] +--/* most read IO */ [qs].[total_physical_reads] / [qs].[execution_count] > 1000 --[Avg Physical Reads] +--/* most intesive in reads */ [qs].[total_logical_reads] / [qs].[execution_count] > 1000 --[Avg Logical Reads] +--/* most IO intensive in write */ [qs].[total_logical_writes] / [qs].[execution_count] > 1000 --[Avg Logical Writes] +/* longest queries */ [qs].[total_elapsed_time] / [qs].[execution_count] > 1000 --[Avg Duration (ms)] +AND DB_NAME([qt].[dbid]) NOT IN ( 'master', 'msdb', 'model', 'tempDb' ) +ORDER BY +--[Avg Logical Reads] DESC +--[qs].[execution_count] DESC +--,[qs].[total_worker_time] / [qs].[execution_count] DESC +--,[qs].[total_physical_reads] / [qs].[execution_count] DESC +--,[qs].[total_logical_reads] / [qs].[execution_count] DESC +--,[qs].[total_logical_writes] / [qs].[execution_count] DESC; +/* average duration */ [qs].[total_elapsed_time] / [qs].[execution_count] DESC; + + +SELECT TOP 100 + 'most cpu' AS msg, + GETDATE() AS [Collection Date], + [qs].[execution_count] AS [Execution Count], + SUBSTRING( + [qt].[text], + [qs].[statement_start_offset] / 2 + 1, + (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 [Query Text], + DB_NAME([qt].[dbid]) AS [DB Name], + [qs].[total_worker_time] AS [Total CPU Time], + [qs].[total_worker_time] / [qs].[execution_count] AS [Avg CPU Time (ms)], + [qs].[total_physical_reads] AS [Total Physical Reads], + [qs].[total_physical_reads] / [qs].[execution_count] AS [Avg Physical Reads], + [qs].[total_logical_reads] AS [Total Logical Reads], + [qs].[total_logical_reads] / [qs].[execution_count] AS [Avg Logical Reads], + [qs].[total_logical_writes] AS [Total Logical Writes], + [qs].[total_logical_writes] / [qs].[execution_count] AS [Avg Logical Writes], + [qs].[total_elapsed_time] AS [Total Duration], + [qs].[total_elapsed_time] / 1000000.0 AS [Total Duration seconds], + [qs].[total_elapsed_time] / [qs].[execution_count] / 1000000.0 AS [Avg Duration seconds], + [qp].[query_plan] AS [Plan], + [qs].[creation_time], + [qs].[last_execution_time] +FROM [sys].[dm_exec_query_stats] AS [qs] + CROSS APPLY [sys].dm_exec_sql_text([qs].[sql_handle]) AS [qt] + CROSS APPLY [sys].dm_exec_query_plan([qs].[plan_handle]) AS [qp] +WHERE +--/* most often used */ [qs].[execution_count] > 50 +/* most CPU intensive */ [qs].[total_worker_time] / [qs].[execution_count] > 100 --[Avg CPU Time (ms)] +--/* most read IO */ [qs].[total_physical_reads] / [qs].[execution_count] > 1000 --[Avg Physical Reads] +--/* most intesive in reads */ [qs].[total_logical_reads] / [qs].[execution_count] > 1000 --[Avg Logical Reads] +--/* most IO intensive in write */ [qs].[total_logical_writes] / [qs].[execution_count] > 1000 --[Avg Logical Writes] +--/* longest queries */[qs].[total_elapsed_time] / [qs].[execution_count] > 1000 --[Avg Duration (ms)] +AND DB_NAME([qt].[dbid]) NOT IN ( 'master', 'msdb', 'model', 'tempDb' ) +ORDER BY +--[Avg Logical Reads] DESC +--[qs].[execution_count] DESC +/* cpu intensive */ [qs].[total_worker_time] / [qs].[execution_count] DESC; +--,[qs].[total_physical_reads] / [qs].[execution_count] DESC +--,[qs].[total_logical_reads] / [qs].[execution_count] DESC +--,[qs].[total_logical_writes] / [qs].[execution_count] DESC; +--/* average duration */,[qs].[total_elapsed_time] / [qs].[execution_count] DESC + + +SELECT TOP 100 + 'most physical reads' AS msg, + GETDATE() AS [Collection Date], + [qs].[execution_count] AS [Execution Count], + SUBSTRING( + [qt].[text], + [qs].[statement_start_offset] / 2 + 1, + (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 [Query Text], + DB_NAME([qt].[dbid]) AS [DB Name], + [qs].[total_worker_time] AS [Total CPU Time], + [qs].[total_worker_time] / [qs].[execution_count] AS [Avg CPU Time (ms)], + [qs].[total_physical_reads] AS [Total Physical Reads], + [qs].[total_physical_reads] / [qs].[execution_count] AS [Avg Physical Reads], + [qs].[total_logical_reads] AS [Total Logical Reads], + [qs].[total_logical_reads] / [qs].[execution_count] AS [Avg Logical Reads], + [qs].[total_logical_writes] AS [Total Logical Writes], + [qs].[total_logical_writes] / [qs].[execution_count] AS [Avg Logical Writes], + [qs].[total_elapsed_time] AS [Total Duration], + [qs].[total_elapsed_time] / 1000000.0 AS [Total Duration seconds], + [qs].[total_elapsed_time] / [qs].[execution_count] / 1000000.0 AS [Avg Duration seconds], + [qp].[query_plan] AS [Plan], + [qs].[creation_time], + [qs].[last_execution_time] +FROM [sys].[dm_exec_query_stats] AS [qs] + CROSS APPLY [sys].dm_exec_sql_text([qs].[sql_handle]) AS [qt] + CROSS APPLY [sys].dm_exec_query_plan([qs].[plan_handle]) AS [qp] +WHERE +--/* most often used */ [qs].[execution_count] > 50 +--/* most CPU intensive */ [qs].[total_worker_time] / [qs].[execution_count] > 100 --[Avg CPU Time (ms)] +/* most read IO */ [qs].[total_physical_reads] / [qs].[execution_count] > 1000 --[Avg Physical Reads] +--/* most intesive in reads */ [qs].[total_logical_reads] / [qs].[execution_count] > 1000 --[Avg Logical Reads] +--/* most IO intensive in write */ [qs].[total_logical_writes] / [qs].[execution_count] > 1000 --[Avg Logical Writes] +--/* longest queries */[qs].[total_elapsed_time] / [qs].[execution_count] > 1000 --[Avg Duration (ms)] +AND DB_NAME([qt].[dbid]) NOT IN ( 'master', 'msdb', 'model', 'tempDb' ) +ORDER BY +--[Avg Logical Reads] DESC +--[qs].[execution_count] DESC +--,[qs].[total_worker_time] / [qs].[execution_count] DESC +/* most disk activity */ [qs].[total_physical_reads] / [qs].[execution_count] DESC; +--,[qs].[total_logical_reads] / [qs].[execution_count] DESC +--,[qs].[total_logical_writes] / [qs].[execution_count] DESC; +--/* average duration */,[qs].[total_elapsed_time] / [qs].[execution_count] DESC +