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
- Query wird ausgeführt
- SQL Server erkennt: Memory-Zuteilung war nicht optimal
- Beim nächsten Mal: besserer Wert (außer Plan wurde recycelt)
- 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?
Situation | Maßnahme |
---|---|
Plan nutzt zu viel Memory | Feedback beobachten, ggf. MIN_GRANT setzen |
Spills trotz Wiederholung | ENABLE_PERSISTED_* prüfen (SQL 2022) |
Feedback macht Query langsamer | DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK |
Schwankende Laufzeiten | Plan 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.
Keine Antworten