Mit Query Store einen guten Plan erzwingen oder einen Hint anhängen
SQL ServerQuery StoreBefehl
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.