Microsoft SQL Server: Query Hints bei Row-Mode Memory Grant Feedback – wie Queries effizienter angepasst werden

Worum geht’s bei Memory Grant Feedback?

Wenn Du eine Query ausführst, schätzt SQL Server vorab, wie viel Speicher gebraucht wird.
Liegt er daneben, hast Du entweder:

  • zu wenig Speicher → Spills in TempDB
  • zu viel Speicher → Ressourcen blockiert

Seit SQL Server 2017 kann die Engine den Grant dynamisch anpassen.
Ab 2019 auch im Row Mode.
Ab 2022 mit Persistenz.

Das Feature heißt: Row-Mode Memory Grant Feedback.

Du musst nichts aktivieren – es passiert automatisch.
Aber: Es gibt Tücken. Und Du kannst mit Query Hints eingreifen.

Wo Du Memory-Probleme erkennst

Execution Plan → Properties eines Operators → „Spilled to TempDB“
Oder in der erweiterten Events-Session:

SELECT 
    event_data.value('(event/data[@name="requested_memory_kb"]/value)[1]', 'INT') AS requested_kb,
    event_data.value('(event/data[@name="granted_memory_kb"]/value)[1]', 'INT') AS granted_kb,
    event_data.value('(event/data[@name="used_memory_kb"]/value)[1]', 'INT') AS used_kb
FROM sys.fn_xe_file_target_read_file('memory_grant_feedback*.xel', NULL, NULL, NULL)
WHERE event_data.value('(event/@name)[1]', 'VARCHAR(100)') = 'memory_grant_updated_by_feedback';

Wie Feedback funktioniert

  1. Query wird ausgeführt
  2. SQL Server erkennt: Memory-Zuteilung war nicht optimal
  3. Beim nächsten Mal: besserer Wert (außer Plan wurde recycelt)
  4. Ab SQL 2022: Feedback wird dauerhaft gespeichert

Das gilt nur, wenn Du den Plan mehrfach verwendest.

Query Hints: Wie Du die Steuerung übernimmst

OPTION (USE HINT(‚DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK‘))

SELECT *
FROM dbo.Auftraege
WHERE status = 'offen'
OPTION (USE HINT('DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'));

Damit schaltest Du das Feedback explizit aus.
Sinnvoll, wenn Du sehr konstante Workloads hast.

OPTION (USE HINT(‚ENABLE_PERSISTED_ROW_MODE_MEMORY_GRANT_FEEDBACK‘))

Nur ab SQL 2022.
Erzwingt, dass Feedback gespeichert bleibt – auch bei Plan-Reuse.

SELECT kunde_id, SUM(betrag)
FROM dbo.Rechnungen
GROUP BY kunde_id
OPTION (USE HINT('ENABLE_PERSISTED_ROW_MODE_MEMORY_GRANT_FEEDBACK'));

OPTION (USE HINT(‚DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK‘))

Wenn Du Batch Mode auf Columnstore nutzt und das Feedback manuell ausschalten willst.

Kombinierbar:

OPTION (USE HINT('DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK', 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'))

Manuelles Tuning: Fallback mit MIN_GRANT_PERCENT

Wenn alles nichts bringt: Du kannst den Grant auch festsetzen.

SELECT *
FROM dbo.Lieferungen
OPTION (MIN_GRANT_PERCENT = 20, MAX_GRANT_PERCENT = 40);

Damit zwingst Du den Optimizer in eine definierte Range.
Aber: Funktioniert nur bei Abfragen, die wirklich viel Speicher brauchen.

Wann solltest Du eingreifen?

SituationMaßnahme
Plan nutzt zu viel MemoryFeedback beobachten, ggf. MIN_GRANT setzen
Spills trotz WiederholungENABLE_PERSISTED_* prüfen (SQL 2022)
Feedback macht Query langsamerDISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK
Schwankende LaufzeitenPlan Forcing oder Query Store nutzen

Mein Fazit

Memory Grant Feedback ist sinnvoll – aber kein Allheilmittel.
Gerade bei Row-Mode Workloads kann es Dir helfen, TempDB-Last und Speicherprobleme zu entschärfen.

Aber wenn’s zickt, hast Du mit Query Hints alles im Griff.
Pragmatisch. Steuerbar. Dokumentierbar.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

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