Skip to content

Commit 0a9986a

Browse files
committed
2 parents eef71a5 + 1e8c5d4 commit 0a9986a

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed

SSMS/SSMS_Tips.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,16 @@ Full instruction here: [EXTENDED EVENTS AND PROFILER: XE PROFILER]
678678
## Vulnerability Assessment in SSMS
679679
You will need version 17.4 for the Vulnerability Assessment feature. Right-click to any database to start a scan.
680680
681+
![SSMS_Database_Default_Reports](/SSMS/SSMS_Tips/SQL_Vulnerability_Assessment.gif)
682+
683+
1. Run a scan
684+
2. Specify where scan will be saved
685+
3. View the report
686+
4. Analyze the results and resolve issues
687+
5. Set your Baseline
688+
6. Run a new scan to see your customized tracking report
689+
7. Open a previously run scan
690+
681691
More info here: [SQL Vulnerability Assessment Available in SSMS] and [Vulnerability Assessment features](https://docs.microsoft.com/en-us/sql/relational-databases/security/sql-vulnerability-assessment)
682692
683693
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
IF OBJECT_ID('dbo.sp_BenchmarkTSQL', 'P') IS NULL
2+
EXECUTE ('CREATE PROCEDURE dbo.sp_BenchmarkTSQL AS SELECT 1');
3+
GO
4+
ALTER PROCEDURE [dbo].[sp_BenchmarkTSQL]
5+
(
6+
@tsqlStatement NVARCHAR(MAX) = N''
7+
, @numberOfExecution INT = 10
8+
, @saveResults BIT = 0
9+
, @clearCache BIT = 0
10+
, @calcMedian BIT = 0
11+
)
12+
AS
13+
/*
14+
.SYNOPSIS
15+
Calculate SQL statement execution time, save results if need.
16+
17+
.DESCRIPTION
18+
Run SQL statement specified times, show results in ms, insert execution details into table [dbo].[BenchmarkTSQL] (create if not exist).
19+
20+
.PARAMETER @tsqlStatement
21+
SQL statement for benchmarking.
22+
23+
.PARAMETER @numberOfExecution
24+
Number of execution SQL statement.
25+
26+
.PARAMETER @saveResults
27+
Save benchmark details to table.
28+
29+
.PARAMETER @clearCache
30+
Clear cached plan for SQL statement .
31+
32+
.PARAMETER @calcMedian
33+
Calculate median of execution time.
34+
35+
.EXAMPLE
36+
[dbo].[sp_BenchmarkTSQL]
37+
@tsqlStatement = 'SELECT * FROM , sys.databases';
38+
-- RETURN: Incorrect syntax near ','.
39+
40+
.EXAMPLE
41+
[dbo].[sp_BenchmarkTSQL]
42+
@tsqlStatement = 'SELECT * FROM sys.databases';
43+
44+
.NOTE
45+
Author: Aleksei Nagorskii
46+
*/
47+
BEGIN TRY
48+
SET NOCOUNT OFF;
49+
50+
IF @tsqlStatement IS NULL
51+
THROW 55001, '@tsqlStatement is NULL, please specify TSQL statement.', 1;
52+
IF @tsqlStatement = N''
53+
THROW 55001, '@tsqlStatement is empty, please specify TSQL statement.', 1;
54+
55+
IF EXISTS (
56+
SELECT 1
57+
FROM sys.dm_exec_describe_first_result_set(@tsqlStatement, NULL, 0)
58+
WHERE error_message IS NOT NULL
59+
AND error_number IS NOT NULL
60+
AND error_severity IS NOT NULL
61+
AND error_state IS NOT NULL
62+
AND error_type IS NOT NULL
63+
AND error_type_desc IS NOT NULL
64+
)
65+
BEGIN
66+
DECLARE @err_msg NVARCHAR(MAX);
67+
SELECT @err_msg = [error_message]
68+
FROM sys.dm_exec_describe_first_result_set(@tsqlStatement, NULL, 0)
69+
WHERE column_ordinal = 0;
70+
THROW 55002, @err_msg, 1;
71+
END
72+
73+
DECLARE @cts DATETIME = CURRENT_TIMESTAMP;
74+
DECLARE @r INT = 0;
75+
DECLARE @handle VARBINARY(64);
76+
DECLARE @min INT;
77+
DECLARE @avg INT;
78+
DECLARE @max INT;
79+
DECLARE @median REAL;
80+
DECLARE @plan_handle VARBINARY(64);
81+
DECLARE @rts DATETIME;
82+
DECLARE @t TABLE (
83+
StartTimeStamp DATETIME2,
84+
RunTimeStamp DATETIME2,
85+
FinishTimeStamp DATETIME2,
86+
TsqlStatement NVARCHAR(MAX),
87+
ClearCache BIT
88+
);
89+
90+
PRINT CONCAT('Benchmark started at ', CONVERT(VARCHAR(23), CURRENT_TIMESTAMP, 121))
91+
WHILE @r < @numberOfExecution
92+
BEGIN
93+
SET @r = @r + 1;
94+
SET @rts = CURRENT_TIMESTAMP;
95+
IF @clearCache = 1
96+
BEGIN
97+
SELECT @handle = plan_handle
98+
FROM sys.dm_exec_cached_plans
99+
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
100+
WHERE [text] LIKE @tsqlStatement;
101+
IF @handle IS NOT NULL
102+
DBCC FREEPROCCACHE (@handle);
103+
END
104+
EXECUTE sp_executesql @tsqlStatement;
105+
PRINT CONCAT('Run ', @r, ', start at ', CONVERT(VARCHAR(23), @rts, 121), ', finish at ', CONVERT(VARCHAR(23), CURRENT_TIMESTAMP, 121),', duration: ', DATEDIFF(ms, @rts, CURRENT_TIMESTAMP), 'ms.');
106+
INSERT @t
107+
VALUES(
108+
@cts,
109+
@rts,
110+
CURRENT_TIMESTAMP,
111+
@tsqlStatement,
112+
@clearCache
113+
);
114+
END
115+
SELECT @min = MIN(DATEDIFF(ms, RunTimeStamp, FinishTimeStamp))
116+
, @avg = AVG(DATEDIFF(ms, RunTimeStamp, FinishTimeStamp))
117+
, @max = MAX(DATEDIFF(ms, RunTimeStamp, FinishTimeStamp))
118+
FROM @t
119+
IF @calcMedian = 1
120+
BEGIN
121+
SELECT @median = (
122+
(SELECT MAX(TMIN) FROM
123+
(SELECT TOP 50 PERCENT DATEDIFF(ms, RunTimeStamp, FinishTimeStamp) AS TMIN FROM @t ORDER BY TMIN) AS BottomHalf)
124+
+
125+
(SELECT MIN(TMAX) FROM
126+
(SELECT TOP 50 PERCENT DATEDIFF(ms, RunTimeStamp, FinishTimeStamp) AS TMAX FROM @t ORDER BY TMAX DESC) AS TopHalf)
127+
) / 2.0
128+
PRINT CONCAT('Min: ', @min, 'ms, average: ', @avg, 'ms, max: ', @max, 'ms, median: ', @median, 'ms.', CHAR(13), 'Benchmark finished at ', CONVERT(VARCHAR(23), CURRENT_TIMESTAMP, 121), '.')
129+
END
130+
ELSE
131+
PRINT CONCAT('Min: ', @min, 'ms, average: ', @avg, 'ms, max: ', @max, 'ms.', CHAR(13), 'Benchmark finished at ', CONVERT(VARCHAR(23), CURRENT_TIMESTAMP, 121), '.')
132+
IF @saveResults = 1
133+
IF OBJECT_ID('.[dbo].[BenchmarkTSQL]', 'U') IS NULL
134+
SELECT * INTO [dbo].[BenchmarkTSQL] FROM @t
135+
ELSE
136+
INSERT INTO [dbo].[BenchmarkTSQL] SELECT * FROM @t
137+
END TRY
138+
139+
BEGIN CATCH
140+
PRINT 'Error: ' + CONVERT(varchar(50), ERROR_NUMBER()) +
141+
', Severity: ' + CONVERT(varchar(5), ERROR_SEVERITY()) +
142+
', State: ' + CONVERT(varchar(5), ERROR_STATE()) +
143+
', Procedure: ' + ISNULL(ERROR_PROCEDURE(), '-') +
144+
', Line: ' + CONVERT(varchar(5), ERROR_LINE()) +
145+
', User name: ' + CONVERT(sysname, CURRENT_USER);
146+
PRINT ERROR_MESSAGE();
147+
END CATCH;
148+
GO

0 commit comments

Comments
 (0)