Skip to content

Commit bfcabe8

Browse files
authored
Change finish step time calculation order, fix some bugs
1 parent 9ce53c8 commit bfcabe8

File tree

1 file changed

+51
-22
lines changed

1 file changed

+51
-22
lines changed

Stored_Procedure/dbo.sp_BenchmarkTSQL.sql

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
IF OBJECT_ID('dbo.sp_BenchmarkTSQL', 'P') IS NULL
2-
EXECUTE ('CREATE PROCEDURE dbo.sp_BenchmarkTSQL AS SELECT 1;');
1+
IF OBJECT_ID('dbo.sp_BenchmarkTSQL', 'P') IS NULL EXEC('CREATE PROCEDURE dbo.sp_BenchmarkTSQL AS SELECT 1;');
32
GO
43

54

@@ -12,7 +11,7 @@ ALTER PROCEDURE dbo.sp_BenchmarkTSQL(
1211
, @skipTSQLCheck BIT = 1
1312
, @clearCache BIT = 0
1413
, @calcMedian BIT = 0
15-
, @printStepInfo BIT = 1
14+
, @printStepInfo BIT = 0
1615
, @durationAccuracy VARCHAR(5) = 'ss'
1716
, @dateTimeFunction VARCHAR(16) = 'SYSDATETIME'
1817
, @additionalInfo BIT = 0
@@ -37,7 +36,7 @@ ALTER PROCEDURE dbo.sp_BenchmarkTSQL(
3736
Number of execution TSQL statement.
3837
3938
.PARAMETER @saveResults
40-
Save benchmark details to master.dbo.BenchmarkTSQL table if @saveResults = 1. Create table if not exists (see 243 line: CREATE TABLE master.dbo.BenchmarkTSQL …).
39+
Save benchmark details to master.dbo.BenchmarkTSQL table if @saveResults = 1. Create table if not exists (see 246 line: CREATE TABLE master.dbo.BenchmarkTSQL …).
4140
4241
.PARAMETER @skipTSQLCheck
4342
Checking for valid TSQL statement. Default value is 1 (true) - skip checking.
@@ -49,16 +48,19 @@ ALTER PROCEDURE dbo.sp_BenchmarkTSQL(
4948
Calculate pseudo median of execution time. Default value is 0 (false) - not calculated.
5049
5150
.PARAMETER @printStepInfo
52-
PRINT detailed step information: step count, start time, end time, duration.
51+
PRINT detailed step information: step count, start time, end time, duration. Default value is 0.
5352
5453
.PARAMETER @durationAccuracy
5554
Duration accuracy calculation, possible values for this stored procedure: ns, mcs, ms, ss, mi, hh, dd, wk. Default value is ss - seconds.
5655
See DATEDIFF https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql
5756
5857
.PARAMETER @dateTimeFunction
59-
Define using datetime function, possible values of functions: SYSDATETIME, SYSUTCDATETIME.
58+
Define using datetime function, possible values of functions: SYSDATETIME, SYSUTCDATETIME. Default value is SYSDATETIME.
6059
See https://docs.microsoft.com/en-us/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql
6160
61+
.PARAMETER @additionalInfo
62+
Save additional session parameteres (ANSI_WARNINGS, XACT_ABORT and etc) to XML column AdditionalInfo in log table master.dbo.BenchmarkTSQL. Default value is 0.
63+
6264
.EXAMPLE
6365
EXEC sp_BenchmarkTSQL
6466
@tsqlStatement = 'SELECT * FROM , sys.databases;'
@@ -126,9 +128,9 @@ The above copyright notice and this permission notice shall be included in all c
126128
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
127129

128130
.NOTE
129-
Version: 5.1
131+
Version: 5.2
130132
Created: 2017-12-14 by Konstantin Taranov
131-
Modified: 2019-03-28 by Konstantin Taranov
133+
Modified: 2019-04-18 by Konstantin Taranov
132134
Main contributors: Konstantin Taranov, Aleksei Nagorskii
133135
Source: https://rebrand.ly/sp_BenchmarkTSQL
134136
*/
@@ -173,10 +175,10 @@ BEGIN TRY
173175
, 'dd' /* day */
174176
, 'wk' /* week */
175177
)
176-
THROW 55004, '@durationAccuracy accept only this values: ns, mcs, ms, ss, mi, hh, wk, dd. See DATEDIFF https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql' , 1;
178+
THROW 55004, '@durationAccuracy accept only this values: ns, mcs, ms, ss, mi, hh, wk, dd. Default value is ss. See DATEDIFF https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql' , 1;
177179

178180
IF @dateTimeFunction NOT IN ('SYSDATETIME', 'SYSUTCDATETIME')
179-
THROW 55005, '@dateTimeFunction accept only SYSUTCDATETIME and SYSDATETIME, default is SYSDATETIME. See https://docs.microsoft.com/en-us/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql', 1;
181+
THROW 55005, '@dateTimeFunction accept only SYSDATETIME and SYSUTCDATETIME. Default value is SYSDATETIME. See https://docs.microsoft.com/en-us/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql', 1;
180182

181183
IF @numberOfExecution <= 0 OR @numberOfExecution >= 32000
182184
THROW 55006, '@numberOfExecution must be > 0 and < 32000. If you want more execution then comment 180 and 181 lines.', 1;
@@ -336,15 +338,36 @@ BEGIN TRY
336338
WHEN @dateTimeFunction = 'SYSUTCDATETIME' THEN SYSUTCDATETIME()
337339
END;
338340

339-
IF @additionalInfo = 0
340-
EXEC sp_executesql @tsqlStatement;
341-
342-
IF @additionalInfo = 1
343-
EXEC sp_executesql @tsqlStatement, N'@additionalXMLOUT XML OUTPUT', @additionalXMLOUT = @additionalXML OUTPUT SELECT @additionalXML;
341+
IF @dateTimeFunction = 'SYSDATETIME'
342+
BEGIN
343+
IF @additionalInfo = 0
344+
BEGIN
345+
EXEC sp_executesql @tsqlStatement;
346+
SET @finishTime = SYSDATETIME();
347+
END;
348+
349+
IF @additionalInfo = 1
350+
BEGIN
351+
EXEC sp_executesql @tsqlStatement, N'@additionalXMLOUT XML OUTPUT', @additionalXMLOUT = @additionalXML OUTPUT SELECT @additionalXML;
352+
SET @finishTime = SYSDATETIME();
353+
END;
354+
END;
355+
356+
IF @dateTimeFunction = 'SYSUTCDATETIME'
357+
BEGIN
358+
IF @additionalInfo = 0
359+
BEGIN
360+
EXEC sp_executesql @tsqlStatement;
361+
SET @finishTime = SYSUTCDATETIME();
362+
END;
363+
364+
IF @additionalInfo = 1
365+
BEGIN
366+
EXEC sp_executesql @tsqlStatement, N'@additionalXMLOUT XML OUTPUT', @additionalXMLOUT = @additionalXML OUTPUT SELECT @additionalXML;
367+
SET @finishTime = SYSUTCDATETIME();
368+
END;
369+
END;
344370

345-
SET @finishTime = CASE WHEN @dateTimeFunction = 'SYSDATETIME' THEN SYSDATETIME()
346-
WHEN @dateTimeFunction = 'SYSUTCDATETIME' THEN SYSUTCDATETIME()
347-
END;
348371
END;
349372

350373
SET @duration = CASE WHEN @durationAccuracy = 'ns' THEN DATEDIFF(ns, @runTimeStamp, @finishTime)
@@ -405,9 +428,9 @@ BEGIN TRY
405428
SELECT @TSQLStatementGUID AS TSQLStatementGUID
406429
, @stepNumber AS StepRowNumber
407430
, StartBenchmarkTime
408-
/* it does not matter which function use (this is NOT NULL column)
431+
, /* it does not matter which function use (this is NOT NULL column)
409432
becasue we update this column later with correct values */
410-
, SYSDATETIME() AS FinishBenchmarkTime
433+
SYSDATETIME() AS FinishBenchmarkTime
411434
, RunTimeStamp
412435
, FinishTimeStamp
413436
, Duration
@@ -424,6 +447,7 @@ BEGIN TRY
424447
END;
425448

426449
IF @printStepInfo = 1
450+
BEGIN
427451
/* Using RAISEEROR for interactive step printing http://sqlity.net/en/984/print-vs-raiserror/ */
428452
SET @RaiseError = 'Run ' + CASE WHEN @stepNumber < 10 THEN ' ' + CAST(@stepNumber AS VARCHAR(30))
429453
WHEN @stepNumber < 100 THEN ' ' + CAST(@stepNumber AS VARCHAR(30))
@@ -436,6 +460,7 @@ BEGIN TRY
436460
END, 121) +
437461
', duration: ' + CAST(@duration AS VARCHAR(100)) + @durationAccuracy + '.';
438462
RAISERROR(@RaiseError, 0, 1) WITH NOWAIT;
463+
END;
439464

440465
IF @tsqlStatementAfter IS NOT NULL AND @tsqlStatementAfter <> ''
441466
EXECUTE sp_executesql @tsqlStatementAfter;
@@ -547,7 +572,11 @@ BEGIN CATCH
547572
IF ERROR_NUMBER() = 535
548573
PRINT('Your @durationAccuracy = ' + @durationAccuracy +
549574
'. Try to use @durationAccuracy with a less precise datepart - seconds (ss) or minutes (mm) or days (dd).' + @crlf +
550-
'But in log table master.dbo.BenchmarkTSQL all times saving with DATETIME2(7) precise! You can manualy calculate difference after decreasing precise datepart.' + @crlf +
551-
'For analyze log rable see latest example in document section.');
575+
'But in log table master.dbo.BenchmarkTSQL (if you run stored procedure with @saveResult = 1) all times saving with DATETIME2(7) precise!' + @crlf +
576+
'You can manualy calculate difference after decreasing precise datepart.' + @crlf +
577+
'For analyze log table see latest examples in document section.');
552578
END CATCH;
553579
GO
580+
581+
EXEC master.sys.sp_MS_marksystemobject @objname = N'dbo.sp_BenchmarkTSQL';
582+
GO

0 commit comments

Comments
 (0)