Skip to content

Commit af6e31b

Browse files
authored
Merge pull request #2692 from alihacks/blitzlock-fix-memory-grant
sp_blitzLock results in excessive memory grant
2 parents 475ec45 + 1609ec3 commit af6e31b

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

sp_BlitzLock.sql

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ You need to use an Azure storage account, and the path has to look like this: ht
187187
finding NVARCHAR(4000)
188188
);
189189

190-
DECLARE @d VARCHAR(40), @StringToExecute NVARCHAR(4000),@StringToExecuteParams NVARCHAR(500),@r NVARCHAR(200),@OutputTableFindings NVARCHAR(100);
190+
DECLARE @d VARCHAR(40), @StringToExecute NVARCHAR(4000),@StringToExecuteParams NVARCHAR(500),@r NVARCHAR(200),@OutputTableFindings NVARCHAR(100),@DeadlockCount INT;
191191
DECLARE @ServerName NVARCHAR(256)
192192
DECLARE @OutputDatabaseCheck BIT;
193193
SET @d = CONVERT(VARCHAR(40), GETDATE(), 109);
@@ -309,17 +309,30 @@ You need to use an Azure storage account, and the path has to look like this: ht
309309
WITH xml
310310
AS ( SELECT CONVERT(XML, event_data) AS deadlock_xml
311311
FROM sys.fn_xe_file_target_read_file(@EventSessionPath, NULL, NULL, NULL) )
312-
SELECT TOP ( @Top ) ISNULL(xml.deadlock_xml, '') AS deadlock_xml
312+
SELECT ISNULL(xml.deadlock_xml, '') AS deadlock_xml
313313
INTO #deadlock_data
314314
FROM xml
315315
LEFT JOIN #t AS t
316316
ON 1 = 1
317-
WHERE xml.deadlock_xml.value('(/event/@name)[1]', 'VARCHAR(256)') = 'xml_deadlock_report'
317+
CROSS APPLY xml.deadlock_xml.nodes('/event/@name') AS x(c)
318+
WHERE 1 = 1
319+
AND x.c.exist('/event/@name[ .= "xml_deadlock_report"]') = 1
318320
AND CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, xml.deadlock_xml.value('(/event/@timestamp)[1]', 'datetime') ), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) > @StartDate
319321
AND CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, xml.deadlock_xml.value('(/event/@timestamp)[1]', 'datetime') ), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) < @EndDate
320322
ORDER BY xml.deadlock_xml.value('(/event/@timestamp)[1]', 'datetime') DESC
321323
OPTION ( RECOMPILE );
322324

325+
/*Optimization: if we got back more rows than @Top, remove them. This seems to be better than using @Top in the query above as that results in excessive memory grant*/
326+
SET @DeadlockCount = @@ROWCOUNT
327+
IF( @Top < @DeadlockCount ) BEGIN
328+
WITH T
329+
AS (
330+
SELECT TOP ( @DeadlockCount - @Top) *
331+
FROM #deadlock_data
332+
ORDER BY #deadlock_data.deadlock_xml.value('(/event/@timestamp)[1]', 'datetime') ASC)
333+
DELETE FROM T
334+
END
335+
323336
/*Parse process and input buffer XML*/
324337
SET @d = CONVERT(VARCHAR(40), GETDATE(), 109);
325338
RAISERROR('Parse process and input buffer XML %s', 0, 1, @d) WITH NOWAIT;

0 commit comments

Comments
 (0)