Hi There,
After upgrading to Sql Monitor v4.0 yesterday, I am seeing the following query against the Sql monitor data repository taking long time and consuming high amounts of CPU and Physical reads.
SELECT * FROM (
SELECT
tq.[Id]
, tq.[ParentId]
, tq.[IdCollectionDate]
, tq.[IdCollectionDate_DateTime]
, tq.[Cluster_Name]
, tq.[Cluster_SqlServer_Name]
, tq.[CollectionDate]
, tq.[Cluster_SqlServer_TopQueries_DatabaseName]
, tq.[Cluster_SqlServer_TopQueries_SqlHandle]
, tq.[Cluster_SqlServer_TopQueries_StatementEnd]
, tq.[Cluster_SqlServer_TopQueries_StatementStart]
, tq.[Cluster_SqlServer_TopQueries_ExecutionCount]
, tq.[Cluster_SqlServer_TopQueries_ExecutionTime]
, tq.[Cluster_SqlServer_TopQueries_LogicalReads]
, tq.[Cluster_SqlServer_TopQueries_LogicalWrites]
, tq.[Cluster_SqlServer_TopQueries_PhysicalReads]
, tq.[Cluster_SqlServer_TopQueries_WorkerTime]
, tqi.[_QueryText] AS [Cluster_SqlServer_TopQueries_QueryText]
, tqs.[Cluster_SqlServer_TopQueries_PlanHandle]
, tqs.[Cluster_SqlServer_TopQueries_CreateDate]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionCount] DESC) AS [Cluster_SqlServer_TopQueries_ExecutionCount_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionTime] DESC) AS [Cluster_SqlServer_TopQueries_ExecutionTime_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalReads] DESC) AS [Cluster_SqlServer_TopQueries_LogicalReads_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalWrites] DESC) AS [Cluster_SqlServer_TopQueries_LogicalWrites_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_PhysicalReads] DESC) AS [Cluster_SqlServer_TopQueries_PhysicalReads_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_WorkerTime] DESC) AS [Cluster_SqlServer_TopQueries_WorkerTime_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionTime] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_ExecutionTime_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalReads] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_LogicalReads_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalWrites] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_LogicalWrites_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_PhysicalReads] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_PhysicalReads_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_WorkerTime] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_WorkerTime_Avg_Rank]
FROM [data].[Cluster_SqlServer_TopQueries_UnstableSamples_CumulativeDifferential](@MinDate, @MaxDate) tq
INNER JOIN [data].[Cluster_SqlServer_TopQueries_Instances] tqi on tqi.[Id] = tq.[Id]
CROSS APPLY (
SELECT TOP 1
[_PlanHandle] [Cluster_SqlServer_TopQueries_PlanHandle]
, [_CreateDate] [Cluster_SqlServer_TopQueries_CreateDate]
FROM [data].[Cluster_SqlServer_TopQueries_StableSamples] x
WHERE x.Id = tq.Id AND x.CollectionDate <= @MaxDate
ORDER BY x.CollectionDate DESC) tqs
WHERE (
tq.[Cluster_SqlServer_TopQueries_ExecutionCount] > 0
OR
tq.[Cluster_SqlServer_TopQueries_ExecutionTime] > 0
OR
tq.[Cluster_SqlServer_TopQueries_LogicalReads] > 0
OR
tq.[Cluster_SqlServer_TopQueries_LogicalWrites] > 0
OR
tq.[Cluster_SqlServer_TopQueries_PhysicalReads] > 0
OR
tq.[Cluster_SqlServer_TopQueries_WorkerTime] > 0
)
AND (
tq.[Cluster_Name] = @Cluster_Name
AND
tq.[Cluster_SqlServer_Name] = @Cluster_SqlServer_Name
AND
(@Cluster_SqlServer_TopQueries_DatabaseName IS NULL OR tq.[Cluster_SqlServer_TopQueries_DatabaseName] = @Cluster_SqlServer_TopQueries_DatabaseName)
AND
(@Cluster_SqlServer_TopQueries_SqlHandle IS NULL OR tq.[Cluster_SqlServer_TopQueries_SqlHandle] = @Cluster_SqlServer_TopQueries_SqlHandle)
AND
(@Cluster_SqlServer_TopQueries_StatementStart IS NULL OR tq.[Cluster_SqlServer_TopQueries_StatementStart] = @Cluster_SqlServer_TopQueries_StatementStart)
AND
(@Cluster_SqlServer_TopQueries_StatementEnd IS NULL OR tq.[Cluster_SqlServer_TopQueries_StatementEnd] = @Cluster_SqlServer_TopQueries_StatementEnd)
)
) s
WHERE (
[Cluster_SqlServer_TopQueries_ExecutionCount_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_ExecutionTime_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalReads_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalWrites_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_PhysicalReads_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_WorkerTime_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_ExecutionTime_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalReads_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalWrites_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_PhysicalReads_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_WorkerTime_Avg_Rank] <= @MaxRank
)
After putting a SQL Server Profiler trace for instance of this query, it seems to be running roughly every 1 minute and 1 second. Here is an example of the full query executed.
exec sp_executesql N'
DECLARE @Version4Date BIGINT
SELECT @Version4Date = utils.DateTimeToTicks(MIN(Date)) FROM versioning.SchemaVersionHistory WHERE LEFT(CodeVersion, 1) >= 4
IF (@Version4Date IS NULL) OR (@MaxDate >= @Version4Date)
SELECT * FROM (
SELECT
tq.[Id]
, tq.[ParentId]
, tq.[IdCollectionDate]
, tq.[IdCollectionDate_DateTime]
, tq.[Cluster_Name]
, tq.[Cluster_SqlServer_Name]
, tq.[CollectionDate]
, tq.[Cluster_SqlServer_TopQueries_DatabaseName]
, tq.[Cluster_SqlServer_TopQueries_SqlHandle]
, tq.[Cluster_SqlServer_TopQueries_StatementEnd]
, tq.[Cluster_SqlServer_TopQueries_StatementStart]
, tq.[Cluster_SqlServer_TopQueries_ExecutionCount]
, tq.[Cluster_SqlServer_TopQueries_ExecutionTime]
, tq.[Cluster_SqlServer_TopQueries_LogicalReads]
, tq.[Cluster_SqlServer_TopQueries_LogicalWrites]
, tq.[Cluster_SqlServer_TopQueries_PhysicalReads]
, tq.[Cluster_SqlServer_TopQueries_WorkerTime]
, tqi.[_QueryText] AS [Cluster_SqlServer_TopQueries_QueryText]
, tqs.[Cluster_SqlServer_TopQueries_PlanHandle]
, tqs.[Cluster_SqlServer_TopQueries_CreateDate]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionCount] DESC) AS [Cluster_SqlServer_TopQueries_ExecutionCount_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionTime] DESC) AS [Cluster_SqlServer_TopQueries_ExecutionTime_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalReads] DESC) AS [Cluster_SqlServer_TopQueries_LogicalReads_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalWrites] DESC) AS [Cluster_SqlServer_TopQueries_LogicalWrites_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_PhysicalReads] DESC) AS [Cluster_SqlServer_TopQueries_PhysicalReads_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_WorkerTime] DESC) AS [Cluster_SqlServer_TopQueries_WorkerTime_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionTime] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_ExecutionTime_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalReads] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_LogicalReads_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalWrites] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_LogicalWrites_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_PhysicalReads] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_PhysicalReads_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_WorkerTime] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_WorkerTime_Avg_Rank]
FROM [data].[Cluster_SqlServer_TopQueries_UnstableSamples_CumulativeDifferential](@MinDate, @MaxDate) tq
INNER JOIN [data].[Cluster_SqlServer_TopQueries_Instances] tqi on tqi.[Id] = tq.[Id]
CROSS APPLY (
SELECT TOP 1
[_PlanHandle] [Cluster_SqlServer_TopQueries_PlanHandle]
, [_CreateDate] [Cluster_SqlServer_TopQueries_CreateDate]
FROM [data].[Cluster_SqlServer_TopQueries_StableSamples] x
WHERE x.Id = tq.Id AND x.CollectionDate <= @MaxDate
ORDER BY x.CollectionDate DESC) tqs
WHERE (
tq.[Cluster_SqlServer_TopQueries_ExecutionCount] > 0
OR
tq.[Cluster_SqlServer_TopQueries_ExecutionTime] > 0
OR
tq.[Cluster_SqlServer_TopQueries_LogicalReads] > 0
OR
tq.[Cluster_SqlServer_TopQueries_LogicalWrites] > 0
OR
tq.[Cluster_SqlServer_TopQueries_PhysicalReads] > 0
OR
tq.[Cluster_SqlServer_TopQueries_WorkerTime] > 0
)
AND (
tq.[Cluster_Name] = @Cluster_Name
AND
tq.[Cluster_SqlServer_Name] = @Cluster_SqlServer_Name
AND
(@Cluster_SqlServer_TopQueries_DatabaseName IS NULL OR tq.[Cluster_SqlServer_TopQueries_DatabaseName] = @Cluster_SqlServer_TopQueries_DatabaseName)
AND
(@Cluster_SqlServer_TopQueries_SqlHandle IS NULL OR tq.[Cluster_SqlServer_TopQueries_SqlHandle] = @Cluster_SqlServer_TopQueries_SqlHandle)
AND
(@Cluster_SqlServer_TopQueries_StatementStart IS NULL OR tq.[Cluster_SqlServer_TopQueries_StatementStart] = @Cluster_SqlServer_TopQueries_StatementStart)
AND
(@Cluster_SqlServer_TopQueries_StatementEnd IS NULL OR tq.[Cluster_SqlServer_TopQueries_StatementEnd] = @Cluster_SqlServer_TopQueries_StatementEnd)
)
) s
WHERE (
[Cluster_SqlServer_TopQueries_ExecutionCount_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_ExecutionTime_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalReads_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalWrites_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_PhysicalReads_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_WorkerTime_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_ExecutionTime_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalReads_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalWrites_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_PhysicalReads_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_WorkerTime_Avg_Rank] <= @MaxRank
)
ELSE -- This is to ensure that post v4.0 Top query retrieval retrieval works on v3.5 data
WITH [SightedIds]([Id]) AS
(
-- The statistics on the sightings tables can be wildly inaccurate (e.g. expected 15M rows in a 17M row table, actually 1k rows).
-- We need to seek by date rather than scanning the whole table, so here we force the date-biased index.
SELECT DISTINCT [Id]
FROM [data].[Cluster_SqlServer_TopQueries_Sightings] WITH (INDEX ([Cluster_SqlServer_TopQueries_Sightings_SightingDate_Id])) -- ([SightingDate], [Id])
WHERE [data].[Cluster_SqlServer_TopQueries_Sightings].[SightingDate] >= @MinDate AND [data].[Cluster_SqlServer_TopQueries_Sightings].[SightingDate] <= @MaxDate
)
SELECT * FROM (
SELECT
tq.[Id]
, tq.[ParentId]
, tq.[IdCollectionDate]
, tq.[IdCollectionDate_DateTime]
, tq.[Cluster_Name]
, tq.[Cluster_SqlServer_Name]
, tq.[CollectionDate]
, tq.[Cluster_SqlServer_TopQueries_DatabaseName]
, tq.[Cluster_SqlServer_TopQueries_SqlHandle]
, tq.[Cluster_SqlServer_TopQueries_StatementEnd]
, tq.[Cluster_SqlServer_TopQueries_StatementStart]
, tq.[Cluster_SqlServer_TopQueries_ExecutionCount]
, tq.[Cluster_SqlServer_TopQueries_ExecutionTime]
, tq.[Cluster_SqlServer_TopQueries_LogicalReads]
, tq.[Cluster_SqlServer_TopQueries_LogicalWrites]
, tq.[Cluster_SqlServer_TopQueries_PhysicalReads]
, tq.[Cluster_SqlServer_TopQueries_WorkerTime]
, tqi.[_QueryText] AS [Cluster_SqlServer_TopQueries_QueryText]
, tqs.[Cluster_SqlServer_TopQueries_PlanHandle]
, tqs.[Cluster_SqlServer_TopQueries_CreateDate]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionCount] DESC) AS [Cluster_SqlServer_TopQueries_ExecutionCount_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionTime] DESC) AS [Cluster_SqlServer_TopQueries_ExecutionTime_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalReads] DESC) AS [Cluster_SqlServer_TopQueries_LogicalReads_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalWrites] DESC) AS [Cluster_SqlServer_TopQueries_LogicalWrites_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_PhysicalReads] DESC) AS [Cluster_SqlServer_TopQueries_PhysicalReads_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_WorkerTime] DESC) AS [Cluster_SqlServer_TopQueries_WorkerTime_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_ExecutionTime] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_ExecutionTime_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalReads] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_LogicalReads_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_LogicalWrites] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_LogicalWrites_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_PhysicalReads] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_PhysicalReads_Avg_Rank]
, ROW_NUMBER() OVER(ORDER BY tq.[Cluster_SqlServer_TopQueries_WorkerTime] / CASE WHEN [Cluster_SqlServer_TopQueries_ExecutionCount] > 0 THEN [Cluster_SqlServer_TopQueries_ExecutionCount] ELSE 1 END DESC) AS [Cluster_SqlServer_TopQueries_WorkerTime_Avg_Rank]
FROM
(
SELECT
[data].[Cluster_SqlServer_TopQueries_Keys].[Id]
, [data].[Cluster_SqlServer_TopQueries_Keys].[ParentId]
, [data].[Cluster_SqlServer_TopQueries_Keys].[CollectionDate] AS [IdCollectionDate]
, [utils].[TicksToDateTime]([data].[Cluster_SqlServer_TopQueries_Keys].[CollectionDate]) AS [IdCollectionDate_DateTime]
, [data].[Cluster_Keys].[_Name] AS [Cluster_Name]
, [data].[Cluster_SqlServer_Keys].[_Name] AS [Cluster_SqlServer_Name]
, [data].[Cluster_SqlServer_TopQueries_Keys].[_DatabaseName] AS [Cluster_SqlServer_TopQueries_DatabaseName]
, [data].[Cluster_SqlServer_TopQueries_Keys].[_SqlHandle] AS [Cluster_SqlServer_TopQueries_SqlHandle]
, [data].[Cluster_SqlServer_TopQueries_Keys].[_StatementEnd] AS [Cluster_SqlServer_TopQueries_StatementEnd]
, [data].[Cluster_SqlServer_TopQueries_Keys].[_StatementStart] AS [Cluster_SqlServer_TopQueries_StatementStart]
, [RightLeaf].[CollectionDate]
, ([RightLeaf].[Cluster_SqlServer_TopQueries_ExecutionCount] - ISNULL([LeftLeaf].[Cluster_SqlServer_TopQueries_ExecutionCount],0)) AS [Cluster_SqlServer_TopQueries_ExecutionCount]
, ([RightLeaf].[Cluster_SqlServer_TopQueries_ExecutionTime] - ISNULL([LeftLeaf].[Cluster_SqlServer_TopQueries_ExecutionTime],0)) AS [Cluster_SqlServer_TopQueries_ExecutionTime]
, ([RightLeaf].[Cluster_SqlServer_TopQueries_LogicalReads] - ISNULL([LeftLeaf].[Cluster_SqlServer_TopQueries_LogicalReads],0)) AS [Cluster_SqlServer_TopQueries_LogicalReads]
, ([RightLeaf].[Cluster_SqlServer_TopQueries_LogicalWrites] - ISNULL([LeftLeaf].[Cluster_SqlServer_TopQueries_LogicalWrites],0)) AS [Cluster_SqlServer_TopQueries_LogicalWrites]
, ([RightLeaf].[Cluster_SqlServer_TopQueries_PhysicalReads] - ISNULL([LeftLeaf].[Cluster_SqlServer_TopQueries_PhysicalReads],0)) AS [Cluster_SqlServer_TopQueries_PhysicalReads]
, ([RightLeaf].[Cluster_SqlServer_TopQueries_WorkerTime] - ISNULL([LeftLeaf].[Cluster_SqlServer_TopQueries_WorkerTime],0)) AS [Cluster_SqlServer_TopQueries_WorkerTime]
FROM [SightedIds]
-- The statistics on the sightings tables can be wildly inaccurate (e.g. expected 400k rows in a 4M row table, actually 2k rows).
-- This causes SQL Server to prefer scans to seeks, wreaking havoc on query times and the cache.
-- Forcing LOOP joins causes SQL Server to prefer seeks again.
INNER LOOP JOIN [data].[Cluster_SqlServer_TopQueries_Keys] ON [data].[Cluster_SqlServer_TopQueries_Keys].[Id] = [SightedIds].[Id]
INNER LOOP JOIN [data].[Cluster_SqlServer_Keys] ON [data].[Cluster_SqlServer_Keys].[Id] = [data].[Cluster_SqlServer_TopQueries_Keys].[ParentId]
INNER LOOP JOIN [data].[Cluster_Keys] ON [data].[Cluster_Keys].[Id] = [data].[Cluster_SqlServer_Keys].[ParentId]
OUTER APPLY
(
SELECT TOP 1 [CollectionDate]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_ExecutionCount] AS [Cluster_SqlServer_TopQueries_ExecutionCount]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_ExecutionTime] AS [Cluster_SqlServer_TopQueries_ExecutionTime]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_LogicalReads] AS [Cluster_SqlServer_TopQueries_LogicalReads]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_LogicalWrites] AS [Cluster_SqlServer_TopQueries_LogicalWrites]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_PhysicalReads] AS [Cluster_SqlServer_TopQueries_PhysicalReads]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_WorkerTime] AS [Cluster_SqlServer_TopQueries_WorkerTime]
FROM [data].[Cluster_SqlServer_TopQueries_UnstableSamples]
WHERE [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[Id] = [data].[Cluster_SqlServer_TopQueries_Keys].[Id]
AND [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[CollectionDate] > @MinDate
AND [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[CollectionDate] <= @MaxDate
ORDER BY [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[CollectionDate] ASC
)
AS [LeftLeaf]CROSS APPLY
(
SELECT TOP 1 [CollectionDate]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_ExecutionCount] AS [Cluster_SqlServer_TopQueries_ExecutionCount]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_ExecutionTime] AS [Cluster_SqlServer_TopQueries_ExecutionTime]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_LogicalReads] AS [Cluster_SqlServer_TopQueries_LogicalReads]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_LogicalWrites] AS [Cluster_SqlServer_TopQueries_LogicalWrites]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_PhysicalReads] AS [Cluster_SqlServer_TopQueries_PhysicalReads]
, [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[_WorkerTime] AS [Cluster_SqlServer_TopQueries_WorkerTime]
FROM [data].[Cluster_SqlServer_TopQueries_UnstableSamples]
WHERE [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[Id] = [data].[Cluster_SqlServer_TopQueries_Keys].[Id]
AND [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[CollectionDate] > @MinDate
AND [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[CollectionDate] <= @MaxDate
ORDER BY [data].[Cluster_SqlServer_TopQueries_UnstableSamples].[CollectionDate] DESC
)
AS [RightLeaf]
) tq
INNER JOIN [data].[Cluster_SqlServer_TopQueries_Instances] tqi on tqi.[Id] = tq.[Id]
CROSS APPLY (
SELECT TOP 1
[_PlanHandle] [Cluster_SqlServer_TopQueries_PlanHandle]
, [_CreateDate] [Cluster_SqlServer_TopQueries_CreateDate]
FROM [data].[Cluster_SqlServer_TopQueries_StableSamples] x
WHERE x.Id = tq.Id AND x.CollectionDate <= @MaxDate
ORDER BY x.CollectionDate DESC) tqs
WHERE (
tq.[Cluster_SqlServer_TopQueries_ExecutionCount] > 0
AND
tq.[Cluster_SqlServer_TopQueries_ExecutionTime] > 0
AND
(
tq.[Cluster_SqlServer_TopQueries_LogicalReads] > 0
OR
tq.[Cluster_SqlServer_TopQueries_LogicalWrites] > 0
OR
tq.[Cluster_SqlServer_TopQueries_PhysicalReads] > 0
OR
tq.[Cluster_SqlServer_TopQueries_WorkerTime] > 0
)
)
AND (
tq.[Cluster_Name] = @Cluster_Name
AND
tq.[Cluster_SqlServer_Name] = @Cluster_SqlServer_Name
AND
(@Cluster_SqlServer_TopQueries_DatabaseName IS NULL OR tq.[Cluster_SqlServer_TopQueries_DatabaseName] = @Cluster_SqlServer_TopQueries_DatabaseName)
AND
(@Cluster_SqlServer_TopQueries_SqlHandle IS NULL OR tq.[Cluster_SqlServer_TopQueries_SqlHandle] = @Cluster_SqlServer_TopQueries_SqlHandle)
AND
(@Cluster_SqlServer_TopQueries_StatementStart IS NULL OR tq.[Cluster_SqlServer_TopQueries_StatementStart] = @Cluster_SqlServer_TopQueries_StatementStart)
AND
(@Cluster_SqlServer_TopQueries_StatementEnd IS NULL OR tq.[Cluster_SqlServer_TopQueries_StatementEnd] = @Cluster_SqlServer_TopQueries_StatementEnd)
)
) s
WHERE (
[Cluster_SqlServer_TopQueries_ExecutionCount_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_ExecutionTime_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalReads_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalWrites_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_PhysicalReads_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_WorkerTime_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_ExecutionTime_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalReads_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_LogicalWrites_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_PhysicalReads_Avg_Rank] <= @MaxRank
OR
[Cluster_SqlServer_TopQueries_WorkerTime_Avg_Rank] <= @MaxRank
)
',N'@Cluster_SqlServer_TopQueries_QueryWaitStats_WaitType nvarchar(4000),@MinDate bigint,@MaxDate bigint,@MaxRank bigint,@Cluster_Name nvarchar(21),@Cluster_SqlServer_Name nvarchar(4000),@Cluster_SqlServer_TopQueries_DatabaseName nvarchar(4000),@Cluster_SqlServer_TopQueries_SqlHandle nvarchar(4000),@Cluster_SqlServer_TopQueries_StatementEnd nvarchar(4000),@Cluster_SqlServer_TopQueries_StatementStart nvarchar(4000)',@Cluster_SqlServer_TopQueries_QueryWaitStats_WaitType=NULL,@MinDate=635281898328112865,@MaxDate=635281934328112865,@MaxRank=10,@Cluster_Name=N'sqlcluster2.itc.local',@Cluster_SqlServer_Name=N'',@Cluster_SqlServer_TopQueries_DatabaseName=NULL,@Cluster_SqlServer_TopQueries_SqlHandle=NULL,@Cluster_SqlServer_TopQueries_StatementEnd=NULL,@Cluster_SqlServer_TopQueries_StatementStart=NULL
After dissecting the query further, I narrowed it down to the following function: data.Cluster_SqlServer_TopQueries_UnstableSamples_CumulativeDifferential which was consuming most of the resources.
Thanks,
Avinash
After upgrading to Sql Monitor v4.0 yesterday, I am seeing the following query against the Sql monitor data repository taking long time and consuming high amounts of CPU and Physical reads.
After putting a SQL Server Profiler trace for instance of this query, it seems to be running roughly every 1 minute and 1 second. Here is an example of the full query executed.
After dissecting the query further, I narrowed it down to the following function: data.Cluster_SqlServer_TopQueries_UnstableSamples_CumulativeDifferential which was consuming most of the resources.
Thanks,
Avinash