22
This post might contain affiliate links. We may earn a commission if you click and make a purchase. Your support is appreciated!
Hier ist deine vollständige und bereinigte Query Store Auswertungsbibliothek für SQL Server 2019, ohne nicht unterstützte Spalten:
✅ 1. Top Queries nach Gesamtdauer (total duration)
sqlKopierenBearbeitenSELECT
qt.query_sql_text,
rs.avg_duration / 1000 AS avg_duration_ms,
rs.count_executions,
rs.total_duration / 1000 AS total_duration_ms,
rs.last_execution_time
FROM sys.query_store_runtime_stats rs
JOIN sys.query_store_plan p ON rs.plan_id = p.plan_id
JOIN sys.query_store_query qs ON p.query_id = qs.query_id
JOIN sys.query_store_query_text qt ON qs.query_text_id = qt.query_text_id
WHERE rs.last_execution_time >= DATEADD(HOUR, -6, GETDATE())
ORDER BY rs.total_duration DESC;
✅ 2. Top Queries nach logischen Lesezugriffen (logical reads)
sqlKopierenBearbeitenSELECT
qt.query_sql_text,
rs.avg_logical_io_reads,
rs.total_logical_io_reads,
rs.count_executions,
rs.last_execution_time
FROM sys.query_store_runtime_stats rs
JOIN sys.query_store_plan p ON rs.plan_id = p.plan_id
JOIN sys.query_store_query qs ON p.query_id = qs.query_id
JOIN sys.query_store_query_text qt ON qs.query_text_id = qt.query_text_id
WHERE rs.last_execution_time >= DATEADD(HOUR, -6, GETDATE())
ORDER BY rs.total_logical_io_reads DESC;
✅ 3. Top Queries nach Ausführungsanzahl
sqlKopierenBearbeitenSELECT
qt.query_sql_text,
rs.count_executions,
rs.avg_duration / 1000 AS avg_duration_ms,
rs.last_execution_time
FROM sys.query_store_runtime_stats rs
JOIN sys.query_store_plan p ON rs.plan_id = p.plan_id
JOIN sys.query_store_query qs ON p.query_id = qs.query_id
JOIN sys.query_store_query_text qt ON qs.query_text_id = qt.query_text_id
WHERE rs.last_execution_time >= DATEADD(HOUR, -6, GETDATE())
ORDER BY rs.count_executions DESC;
✅ 4. Queries mit mehreren Ausführungsplänen
sqlKopierenBearbeitenSELECT
qt.query_sql_text,
q.query_id,
COUNT(DISTINCT p.plan_id) AS num_plans,
MAX(rs.last_execution_time) AS last_executed
FROM sys.query_store_query q
JOIN sys.query_store_plan p ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_id
JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
GROUP BY qt.query_sql_text, q.query_id
HAVING COUNT(DISTINCT p.plan_id) > 1
ORDER BY num_plans DESC;
Wenn du diese Auswertungen regelmäßig brauchst, kann ich dir sie auch als .sql-Skript zum Download zusammenstellen – einfach Bescheid sagen.
<hr>
Sehr gerne! Hier ist ein T-SQL-Skript, das du problemlos in einen SQL Server Agent Job einbauen kannst. Es misst den Füllgrad der TempDB und protokolliert die Nutzung von User-Objekten, internen Objekten, Version Store und freiem Speicherplatz.
✅ Ziel: Protokollierung des TempDB-Nutzungsgrads über die Zeit
🔧 1. Schritt: Logging-Tabelle anlegen
sqlKopierenBearbeitenUSE [msdb]; -- Oder eigene Monitoring-DB
IF OBJECT_ID('dbo.TempDB_UsageLog', 'U') IS NULL
BEGIN
CREATE TABLE dbo.TempDB_UsageLog (
LogTime DATETIME NOT NULL DEFAULT GETDATE(),
FreeMB INT,
UserObjectsMB INT,
InternalObjectsMB INT,
VersionStoreMB INT,
MixedExtentsMB INT
);
END
🚀 2. Schritt: Abfrage für Agent Job (z. B. alle 5–15 Minuten)
sqlKopierenBearbeitenINSERT INTO msdb.dbo.TempDB_UsageLog (FreeMB, UserObjectsMB, InternalObjectsMB, VersionStoreMB, MixedExtentsMB)
SELECT
SUM(unallocated_extent_page_count) * 8 / 1024 AS FreeMB,
SUM(user_object_reserved_page_count) * 8 / 1024 AS UserObjectsMB,
SUM(internal_object_reserved_page_count) * 8 / 1024 AS InternalObjectsMB,
SUM(version_store_reserved_page_count) * 8 / 1024 AS VersionStoreMB,
SUM(mixed_extent_page_count) * 8 / 1024 AS MixedExtentsMB
FROM sys.dm_db_file_space_usage;
📊 Optional: Analyse-Query zur grafischen Auswertung
sqlKopierenBearbeitenSELECT
LogTime,
FreeMB,
UserObjectsMB,
InternalObjectsMB,
VersionStoreMB
FROM msdb.dbo.TempDB_UsageLog
ORDER BY LogTime DESC;
🛠 Empfehlung für den SQL Agent Job:
- Jobname:
Log TempDB Usage - Schritt 1: T-SQL aus obigem Insert-Skript
- Zeitplan: alle 5–15 Minuten (je nach Auflösung)
- Aufbewahrung: evtl. per zweitem Job aufräumen (älter als 30 Tage löschen)
sqlKopierenBearbeitenDELETE FROM msdb.dbo.TempDB_UsageLog WHERE LogTime < DATEADD(DAY, -30, GETDATE());
Wenn
This post might contain affiliate links. We may earn a commission if you click and make a purchase. Your support is appreciated!
Björn arbeitet auch weiterhin aus Griechenland als Senior Consultant – Microsoft Data Platform und Cloud für die Kramer&Crew in Köln. Auch der Community bleibt er aus der neuen Heimat treu, er engagiert sich auf Data Saturdays oder in unterschiedlichen Foren. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure SQL für Science-Fiction, Backen 😉 und Radfahren.
Amazon.com Empfehlungen
Damit ich auch meine Kosten für den Blog ein wenig senken kann, verwende ich auf diese Seite das Amazon.com Affiliate Programm, so bekomme ich – falls ihr ein Produkt über meinen Link kauft, eine kleine Provision (ohne zusätzliche Kosten für euch!).
Auto Amazon Links: Keine Produkte gefunden.
