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:

Schlagwörter: