DBAtlas · Atlas für Datenbankbetrieb

Mit Query Store einen guten Plan erzwingen oder einen Hint anhängen

SQL ServerQuery Store

Befehl

USE [Musteri];
-- Force the good plan (query_id / plan_id from the regression query):
EXEC sys.sp_query_store_force_plan @query_id = 42, @plan_id = 7;

-- Forced plans and failure reason:
SELECT p.query_id, p.plan_id, p.is_forced_plan, p.plan_forcing_type_desc,
       p.force_failure_count, p.last_force_failure_reason_desc
FROM   sys.query_store_plan p
WHERE  p.is_forced_plan = 1;

-- Undo:
EXEC sys.sp_query_store_unforce_plan @query_id = 42, @plan_id = 7;

-- 2022+: attach / remove a hint without changing code:
EXEC sys.sp_query_store_set_hints @query_id = 42, @query_hints = N'OPTION (RECOMPILE)';
SELECT query_id, query_hint_text, last_query_hint_failure_reason_desc
FROM   sys.query_store_query_hints;
EXEC sys.sp_query_store_clear_hints @query_id = 42;

Was es tut

Erzwingt für die gewählte Abfrage einen bestimmten Query-Store-Plan; der Optimizer verwendet diesen Plan bei jeder Kompilierung. Unter 2022 kannst du alternativ Hints wie RECOMPILE, MAXDOP oder OPTIMIZE FOR anhängen, ohne den Anwendungscode zu ändern.

Wann einsetzen

Wenn eine Planregression in der Produktion dringend behoben werden muss, bis eine dauerhafte Lösung (Index, Umschreiben der Abfrage, Statistiken) bereitsteht.

Vorsicht

Ein erzwungener Plan kann mit wachsenden Daten schlechter werden und ist keine dauerhafte Lösung; überprüfe ihn regelmäßig. Wird ein vom Plan genutzter Index gelöscht/umbenannt, schlägt das Erzwingen fehl (last_force_failure_reason_desc = NO_INDEX usw.) und die Abfrage wird normal kompiliert. Nach dem Erzwingen kann ein "morally equivalent"-Plan unter einer neuen plan_id erscheinen; das ist erwartet. Erzwingen funktioniert auch, während Query Store READ_ONLY ist, prüfe es aber nach einem Restore oder AG-Failover.

In DBAtlas öffnen →

Verwandte Einträge