new_sqlserver_updates_available

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!