@@ -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 */
110111SELECT
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
115117SELECT
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