Microsoft SQL Server zu Query Store für Replikate => Wie ich jetzt auch sekundäre Replikate im Blick behalten kann

Endlich: Query Store auch auf Read-Only Replikaten

Früher konntest Du Query Store nur auf dem Primärserver nutzen.
Die sekundären Replikate? Blackbox.
Kein Einblick in Abfragen. Keine Laufzeiten. Keine Ausreißer sichtbar.

Seit SQL Server 2022: Query Store ist auch auf Read-Only-Replikaten verfügbar.
Du kannst endlich sehen, was Deine Reports, Schnittstellen und Benutzer da wirklich treiben.

Warum das wichtig ist

  • Du erkennst Performance-Probleme auch auf der Reporting-Seite
  • Du siehst Unterschiede zwischen Replikat und Primär (z. B. durch Statistiken)
  • Du kannst Queries gezielt optimieren, bevor sich jemand beschwert
  • Du kannst Lastverteilung messbar machen

Aktivierung des Query Store für ein sekundäres Replikat

Ab SQL Server 2022 brauchst Du nur einen Parameter:

ALTER DATABASE DeineDatenbank 
SET QUERY_STORE = ON 
(READ_WRITE, 
 OPERATION_MODE = READ_ONLY_SECONDARY);

Alternativ (z. B. über SSMS oder Skript):

ALTER DATABASE DeineDatenbank 
SET QUERY_STORE (OPERATION_MODE = READ_ONLY_SECONDARY);

Wichtig: Das geht nur, wenn die Datenbank im sekundären Modus läuft.
Du musst also direkt auf dem Replikat arbeiten.

Abfragen gegen Query Store am Replikat

Alles, was Du vom Primärsystem kennst, geht jetzt auch hier:

SELECT TOP 10 
    qs.query_id,
    qt.query_sql_text,
    rs.avg_duration,
    rs.execution_type_desc
FROM sys.query_store_query_text qt
JOIN sys.query_store_query qs ON qt.query_text_id = qs.query_text_id
JOIN sys.query_store_plan p ON qs.query_id = p.query_id
JOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_id
ORDER BY rs.avg_duration DESC;

Oder konkret:

-- Abfragen mit vielen Reads
SELECT TOP 10 
    qt.query_sql_text,
    SUM(rs.total_logical_reads) AS Reads
FROM sys.query_store_query_text qt
JOIN sys.query_store_query q ON qt.query_text_id = q.query_text_id
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
GROUP BY qt.query_sql_text
ORDER BY Reads DESC;

So siehst Du, welche Reports oder Power BI-Modelle Deinen Replikat-Server stressen.

Unterschiede zwischen Primär und Sekundär

Achte auf:

  • unterschiedliche Ausführungspläne (andere Statistiken, andere Caches)
  • längere Wartezeiten (z. B. durch Netzwerk oder Lesezugriffe auf kalte Daten)
  • inkonsistente Parameter Sniffing-Effekte

Beispiel:

-- Vergleich Plan Hash auf Primär vs. Sekundär
SELECT query_id, plan_id, query_plan_hash
FROM sys.query_store_plan
WHERE query_id = 1234;

Wenn die query_plan_hash unterschiedlich ist, weißt Du, warum es ruckelt.

Tabelle: Unterschiede Query Store vorher / jetzt

FeatureFrüher (bis SQL 2019)Jetzt (ab SQL 2022)
Query Store auf ReplikatNicht möglichJa, vollständig
Zugriff auf Read-Only-WorkloadsNur über Logging / TracingQuery Store möglich
Plananalyse pro StandortNur PrimärJetzt auch Sekundär
Vergleich zwischen ReplikatenManuell mit AufwandDirekt über T-SQL
Nutzung in Azure SQL MI / AGTeilweiseVollständig unterstützt

Was ich regelmäßig prüfe

  • Query Store Größe und Speicherdauer
  • Welche Queries kommen von Report-Usern?
  • Welche Pläne weichen ab?
  • Wo sind die meisten Leseoperationen?
  • Gibt es lange Laufzeiten, obwohl CPU kaum genutzt wird?
-- Query Store Größe prüfen
SELECT actual_state_desc, readonly_reason
FROM sys.database_query_store_options;

Mein trockener Schlussgedanke

Du schiebst die Reports auf die Replikate, damit’s schneller läuft.
Aber wenn Du da nicht reinguckst, weißt Du nicht, ob es das wirklich tut.

Jetzt kannst Du.
Also: Mach’s.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert