Skip to content

Commit 357a316

Browse files
committed
#983 sp_BlitzFirst: adding categories to wait stats
Also added an index to the wait stats table.
1 parent 3fd0a7a commit 357a316

File tree

1 file changed

+33
-4
lines changed

1 file changed

+33
-4
lines changed

sp_BlitzFirst.sql

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,16 @@ DECLARE @StringToExecute NVARCHAR(MAX),
103103
@OutputTableNameFileStats_View NVARCHAR(256),
104104
@OutputTableNamePerfmonStats_View NVARCHAR(256),
105105
@OutputTableNameWaitStats_View NVARCHAR(256),
106+
@OutputTableNameWaitStats_Categories NVARCHAR(256),
106107
@ObjectFullName NVARCHAR(2000),
107108
@BlitzWho NVARCHAR(MAX) = N'EXEC dbo.sp_BlitzWho @ShowSleepingSPIDs = ' + CONVERT(NVARCHAR(1), @ShowSleepingSPIDs) + N';';
108109

109110
/* Sanitize our inputs */
110111
SELECT
111112
@OutputTableNameFileStats_View = QUOTENAME(@OutputTableNameFileStats + '_Deltas'),
112113
@OutputTableNamePerfmonStats_View = QUOTENAME(@OutputTableNamePerfmonStats + '_Deltas'),
113-
@OutputTableNameWaitStats_View = QUOTENAME(@OutputTableNameWaitStats + '_Deltas');
114+
@OutputTableNameWaitStats_View = QUOTENAME(@OutputTableNameWaitStats + '_Deltas'),
115+
@OutputTableNameWaitStats_Categories = QUOTENAME(@OutputTableNameWaitStats + '_Categories');
114116

115117
SELECT
116118
@OutputDatabaseName = QUOTENAME(@OutputDatabaseName),
@@ -2675,10 +2677,36 @@ BEGIN
26752677
wait_time_ms BIGINT,
26762678
signal_wait_time_ms BIGINT,
26772679
waiting_tasks_count BIGINT ,
2678-
CONSTRAINT [PK_' + CAST(NEWID() AS CHAR(36)) + '] PRIMARY KEY CLUSTERED (ID ASC));'
2680+
CONSTRAINT [PK_' + CAST(NEWID() AS CHAR(36)) + '] PRIMARY KEY CLUSTERED (ID));' + @LineFeed
2681+
+ 'CREATE NONCLUSTERED INDEX IX_ServerName_wait_type_CheckDate_Includes ON ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats + @LineFeed
2682+
+ '(ServerName, wait_type, CheckDate) INCLUDE (wait_time_ms, signal_wait_time_ms, waiting_tasks_count);'
2683+
26792684
EXEC(@StringToExecute);
26802685

2681-
/* Create the view */
2686+
/* Create the wait stats category table */
2687+
SET @ObjectFullName = @OutputDatabaseName + N'.' + @OutputSchemaName + N'.' + @OutputTableNameWaitStats_Categories;
2688+
IF OBJECT_ID(@ObjectFullName) IS NULL
2689+
BEGIN
2690+
SET @StringToExecute = 'USE '
2691+
+ @OutputDatabaseName
2692+
+ '; EXEC (''CREATE TABLE '
2693+
+ @OutputSchemaName + '.'
2694+
+ @OutputTableNameWaitStats_Categories + ' (WaitType NVARCHAR(60) PRIMARY KEY CLUSTERED, WaitCategory NVARCHAR(128) NOT NULL);'')'
2695+
EXEC(@StringToExecute);
2696+
END
2697+
2698+
/* Make sure the wait stats category table has the current number of rows */
2699+
SET @StringToExecute = 'USE '
2700+
+ @OutputDatabaseName
2701+
+ '; EXEC (''IF (SELECT COALESCE(SUM(1),0) FROM ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats_Categories + ') <> (SELECT COALESCE(SUM(1),0) FROM ##WaitCategories)' + @LineFeed
2702+
+ 'BEGIN ' + @LineFeed
2703+
+ 'TRUNCATE TABLE ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats_Categories + @LineFeed
2704+
+ 'INSERT INTO ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats_Categories + ' (WaitType, WaitCategory) SELECT WaitType, WaitCategory FROM ##WaitCategories;' + @LineFeed
2705+
+ 'END'')'
2706+
EXEC(@StringToExecute);
2707+
2708+
2709+
/* Create the wait stats view */
26822710
SET @ObjectFullName = @OutputDatabaseName + N'.' + @OutputSchemaName + N'.' + @OutputTableNameWaitStats_View;
26832711
IF OBJECT_ID(@ObjectFullName) IS NULL
26842712
BEGIN
@@ -2687,14 +2715,15 @@ BEGIN
26872715
+ '; EXEC (''CREATE VIEW '
26882716
+ @OutputSchemaName + '.'
26892717
+ @OutputTableNameWaitStats_View + ' AS ' + @LineFeed
2690-
+ 'SELECT w.ServerName, w.CheckDate, w.wait_type' + @LineFeed
2718+
+ 'SELECT w.ServerName, w.CheckDate, w.wait_type, wc.WaitCategory' + @LineFeed
26912719
+ ', DATEDIFF(ss, wPrior.CheckDate, w.CheckDate) AS ElapsedSeconds' + @LineFeed
26922720
+ ', (w.wait_time_ms - wPrior.wait_time_ms) AS wait_time_ms_delta' + @LineFeed
26932721
+ ', (w.signal_wait_time_ms - wPrior.signal_wait_time_ms) AS signal_wait_time_ms_delta' + @LineFeed
26942722
+ ', (w.waiting_tasks_count - wPrior.waiting_tasks_count) AS waiting_tasks_count_delta' + @LineFeed
26952723
+ 'FROM ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats + ' w' + @LineFeed
26962724
+ 'INNER JOIN ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats + ' wPrior ON w.ServerName = wPrior.ServerName AND w.wait_type = wPrior.wait_type AND w.CheckDate > wPrior.CheckDate' + @LineFeed
26972725
+ 'LEFT OUTER JOIN ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats + ' wMiddle ON w.ServerName = wMiddle.ServerName AND w.wait_type = wMiddle.wait_type AND w.CheckDate > wMiddle.CheckDate AND wMiddle.CheckDate > wPrior.CheckDate' + @LineFeed
2726+
+ 'LEFT OUTER JOIN ' + @OutputSchemaName + '.' + @OutputTableNameWaitStats_Categories + ' wc ON w.wait_type = wc.WaitType' + @LineFeed
26982727
+ 'WHERE wMiddle.ID IS NULL AND (w.wait_time_ms - wPrior.wait_time_ms) > 0;;'')'
26992728
EXEC(@StringToExecute);
27002729
END

0 commit comments

Comments
 (0)