Query Store로 좋은 실행 계획 강제 또는 힌트 부착
SQL ServerQuery Store명령어
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;하는 일
선택한 쿼리에 특정 Query Store 실행 계획을 강제하여 옵티마이저가 매 컴파일마다 그 계획을 사용하게 한다. 2022에서는 대신 애플리케이션 코드를 바꾸지 않고 RECOMPILE, MAXDOP, OPTIMIZE FOR 같은 힌트를 부착할 수 있다.
사용 시점
운영 환경에서 실행 계획 회귀를 긴급히 수정해야 할 때, 영구 해결책(인덱스, 쿼리 재작성, 통계)이 준비될 때까지.
주의
강제된 계획은 데이터가 늘면서 성능이 저하될 수 있으며 영구 해결책이 아니므로 정기적으로 검토한다. 계획이 사용하는 인덱스가 삭제/이름 변경되면 강제가 실패하고(last_force_failure_reason_desc = NO_INDEX 등) 쿼리는 정상적으로 컴파일된다. 강제 후 "사실상 동일한" 계획이 새 plan_id로 나타날 수 있으며 이는 정상이다. 강제는 Query Store가 READ_ONLY여도 동작하지만 복원 또는 AG 페일오버 후에는 확인한다.