MSSQL Performance Skript
kleines Skript um a bissi die Performance eines SQL Servers zu testen.
/* ============================================================
SQL Server Network Wait Performance Test
============================================================ */
SET NOCOUNT OFF;
USE tempdb;
GO
---------------------------------------------------------------
-- 1) Wait-Stats Baseline
---------------------------------------------------------------
IF OBJECT_ID('tempdb..#waits_baseline') IS NOT NULL DROP TABLE #waits_baseline;
SELECT
wait_type,
wait_time_ms,
signal_wait_time_ms
INTO #waits_baseline
FROM sys.dm_os_wait_stats;
---------------------------------------------------------------
-- 2) Testtabelle erzeugen (großes Resultset)
---------------------------------------------------------------
IF OBJECT_ID('dbo.NetworkWaitTest') IS NOT NULL
DROP TABLE dbo.NetworkWaitTest;
CREATE TABLE dbo.NetworkWaitTest
(
ID INT IDENTITY PRIMARY KEY,
Payload CHAR(8000) NOT NULL
);
-- ca. 800 MB Payload
INSERT INTO dbo.NetworkWaitTest (Payload)
SELECT TOP (100000)
REPLICATE('X', 8000)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
---------------------------------------------------------------
-- 3) Testparameter
---------------------------------------------------------------
DECLARE
@Runs INT = 5, -- Anzahl der Abfragen
@i INT = 1,
@StartTime DATETIME2,
@EndTime DATETIME2,
@DurationMs BIGINT;
IF OBJECT_ID('tempdb..#runs') IS NOT NULL DROP TABLE #runs;
CREATE TABLE #runs
(
RunNumber INT,
DurationMs BIGINT
);
---------------------------------------------------------------
-- 4) Abfragen ausführen & Laufzeiten messen
---------------------------------------------------------------
WHILE @i <= @Runs
BEGIN
SET @StartTime = SYSDATETIME();
-- absichtlich großes Resultset
SELECT *
FROM dbo.NetworkWaitTest;
SET @EndTime = SYSDATETIME();
SET @DurationMs = DATEDIFF(MILLISECOND, @StartTime, @EndTime);
INSERT INTO #runs (RunNumber, DurationMs)
VALUES (@i, @DurationMs);
SET @i += 1;
END
---------------------------------------------------------------
-- 5) Laufzeitstatistik
---------------------------------------------------------------
SELECT
COUNT(*) AS Runs,
MIN(DurationMs) AS MinMs,
MAX(DurationMs) AS MaxMs,
AVG(DurationMs) AS AvgMs
FROM #runs;
---------------------------------------------------------------
-- 6) Wait-Stats Delta (nach Test)
---------------------------------------------------------------
SELECT
w.wait_type,
(w.wait_time_ms - b.wait_time_ms) AS wait_time_delta_ms,
(w.signal_wait_time_ms - b.signal_wait_time_ms) AS signal_wait_delta_ms
FROM sys.dm_os_wait_stats w
JOIN #waits_baseline b
ON w.wait_type = b.wait_type
WHERE (w.wait_time_ms - b.wait_time_ms) > 0
ORDER BY wait_time_delta_ms DESC;