@@ -139,9 +139,7 @@ DECLARE @StringToExecute NVARCHAR(MAX),
139139 @UnquotedOutputDatabaseName NVARCHAR (256 ) = @OutputDatabaseName ,
140140 @UnquotedOutputSchemaName NVARCHAR (256 ) = @OutputSchemaName ,
141141 @LocalServerName NVARCHAR (128 ) = CAST (SERVERPROPERTY (' ServerName' ) AS NVARCHAR (128 )),
142- @dm_exec_query_statistics_xml BIT = 0 ,
143- @thread_time_sql NVARCHAR (MAX ) = N ' ' ,
144- @thread_time_ms FLOAT
142+ @dm_exec_query_statistics_xml BIT = 0 ;
145143
146144/* Sanitize our inputs */
147145SELECT
@@ -1303,73 +1301,6 @@ BEGIN
13031301 INSERT INTO #PerfmonCounters ([object_name],[counter_name],[instance_name]) VALUES (' SQL Server 2017 XTP Transactions' ,' Transactions created/sec' ,NULL );
13041302 END ;
13051303
1306- SET @thread_time_sql = N'
1307- SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
1308-
1309- SELECT
1310- @thread_time_ms =
1311- ROUND
1312- (
1313- t.total_thread_time_ms,
1314- 2
1315- )
1316- FROM
1317- (
1318- SELECT
1319- total_thread_time_ms =
1320- CONVERT
1321- (
1322- float,
1323- -- time spent waiting by threads running user queries
1324- SUM(w.wait_time_ms) +
1325- -- time spent running on a visible scheduler
1326- (
1327- SELECT
1328- SUM(s.total_cpu_usage_ms)
1329- FROM sys.dm_os_schedulers AS s
1330- WHERE s.status = '' VISIBLE ONLINE''
1331- AND s.is_online = 1
1332- )
1333- )
1334- FROM
1335- (
1336- SELECT
1337- os.wait_type,
1338- wait_time_ms =
1339- os.wait_time_ms
1340- FROM sys.dm_os_wait_stats AS os
1341-
1342- UNION ALL
1343-
1344- SELECT
1345- owt.wait_type,
1346- wait_time_ms =
1347- owt.wait_duration_ms
1348- FROM sys.dm_os_waiting_tasks AS owt
1349- WHERE owt.session_id > 50
1350-
1351- ) AS w
1352- WHERE NOT EXISTS
1353- (
1354- -- Exclude waits unrelated to user queries
1355- SELECT
1356- 1/0
1357- FROM ##WaitCategories AS wc
1358- WHERE wc.WaitType = w.wait_type
1359- AND wc.Ignorable = 1
1360- )
1361- ) AS t;'
1362-
1363- IF SERVERPROPERTY (' Edition' ) = ' SQL Azure'
1364- BEGIN
1365- SET @thread_time_sql =
1366- REPLACE (@thread_time_sql, N ' sys.dm_os_wait_stats' , N ' sys.dm_db_wait_stats' );
1367- END
1368-
1369- EXEC sys .sp_executesql
1370- @thread_time_sql,
1371- N ' @thread_time_ms FLOAT OUTPUT' ,
1372- @thread_time_ms OUT ;
13731304
13741305 /* Populate #FileStats, #PerfmonStats, #WaitStats with DMV data.
13751306 After we finish doing our checks, we'll take another sample and compare them. */
@@ -1381,7 +1312,18 @@ BEGIN
13811312 x.SampleTime,
13821313 x.wait_type,
13831314 SUM(x.sum_wait_time_ms) AS sum_wait_time_ms,
1384- CASE @Seconds WHEN 0 THEN 0 ELSE @thread_time_ms END AS thread_time_ms,
1315+ CASE @Seconds
1316+ WHEN 0
1317+ THEN 0
1318+ ELSE
1319+ (
1320+ SELECT
1321+ SUM(s.total_cpu_usage_ms)
1322+ FROM sys.dm_os_schedulers AS s
1323+ WHERE s.status = '' VISIBLE ONLINE''
1324+ AND s.is_online = 1
1325+ )
1326+ END AS thread_time_ms,
13851327 SUM(x.sum_signal_wait_time_ms) AS sum_signal_wait_time_ms,
13861328 SUM(x.sum_waiting_tasks) AS sum_waiting_tasks
13871329 FROM (
@@ -1425,12 +1367,29 @@ BEGIN
14251367 EXEC sp_executesql
14261368 @StringToExecute,
14271369 N' @StartSampleTime DATETIMEOFFSET,
1428- @Seconds INT,
1429- @thread_time_ms float' ,
1370+ @Seconds INT' ,
14301371 @StartSampleTime,
1431- @Seconds,
1432- @thread_time_ms;
1372+ @Seconds;
14331373
1374+ WITH w AS
1375+ (
1376+ SELECT
1377+ total_waits =
1378+ CONVERT
1379+ (
1380+ FLOAT ,
1381+ SUM (ws .wait_time_ms )
1382+ )
1383+ FROM #WaitStats AS ws
1384+ WHERE Pass = 1
1385+ )
1386+ UPDATE ws
1387+ SET ws .thread_time_ms =
1388+ ws .thread_time_ms + w .total_waits
1389+ FROM #WaitStats AS ws
1390+ CROSS JOIN w
1391+ WHERE ws .Pass = 1
1392+ OPTION (RECOMPILE );
14341393
14351394 INSERT INTO #FileStats (Pass, SampleTime, DatabaseID, FileID, DatabaseName, FileLogicalName, SizeOnDiskMB, io_stall_read_ms ,
14361395 num_of_reads, [bytes_read] , io_stall_write_ms,num_of_writes, [bytes_written], PhysicalName, TypeDesc)
@@ -2537,11 +2496,6 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
25372496 WAITFOR TIME @FinishSampleTimeWaitFor;
25382497 END ;
25392498
2540- EXEC sys .sp_executesql
2541- @thread_time_sql,
2542- N ' @thread_time_ms FLOAT OUTPUT' ,
2543- @thread_time_ms OUT ;
2544-
25452499
25462500 RAISERROR (' Capturing second pass of wait stats, perfmon counters, file stats' ,10 ,1 ) WITH NOWAIT ;
25472501 /* Populate #FileStats, #PerfmonStats, #WaitStats with DMV data. In a second, we'll compare these. */
@@ -2552,7 +2506,13 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
25522506 x.SampleTime,
25532507 x.wait_type,
25542508 SUM(x.sum_wait_time_ms) AS sum_wait_time_ms,
2555- @thread_time_ms AS thread_time_ms,
2509+ (
2510+ SELECT
2511+ SUM(s.total_cpu_usage_ms)
2512+ FROM sys.dm_os_schedulers AS s
2513+ WHERE s.status = '' VISIBLE ONLINE''
2514+ AND s.is_online = 1
2515+ ) AS thread_time_ms,
25562516 SUM(x.sum_signal_wait_time_ms) AS sum_signal_wait_time_ms,
25572517 SUM(x.sum_waiting_tasks) AS sum_waiting_tasks
25582518 FROM (
@@ -2595,11 +2555,28 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
25952555
25962556 EXEC sp_executesql
25972557 @StringToExecute,
2598- N' @Seconds INT,
2599- @thread_time_ms FLOAT' ,
2600- @Seconds,
2601- @thread_time_ms;
2558+ N ' @Seconds INT' ,
2559+ @Seconds;
26022560
2561+ WITH w AS
2562+ (
2563+ SELECT
2564+ total_waits =
2565+ CONVERT
2566+ (
2567+ FLOAT ,
2568+ SUM (ws .wait_time_ms )
2569+ )
2570+ FROM #WaitStats AS ws
2571+ WHERE Pass = 2
2572+ )
2573+ UPDATE ws
2574+ SET ws .thread_time_ms =
2575+ ws .thread_time_ms + w .total_waits
2576+ FROM #WaitStats AS ws
2577+ CROSS JOIN w
2578+ WHERE ws .Pass = 2
2579+ OPTION (RECOMPILE );
26032580
26042581 INSERT INTO #FileStats (Pass, SampleTime, DatabaseID, FileID, DatabaseName, FileLogicalName, SizeOnDiskMB, io_stall_read_ms ,
26052582 num_of_reads, [bytes_read] , io_stall_write_ms,num_of_writes, [bytes_written], PhysicalName, TypeDesc, avg_stall_read_ms, avg_stall_write_ms)
0 commit comments