DBAtlas · 데이터베이스 운영 아틀라스

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 페일오버 후에는 확인한다.

DBAtlas에서 열기 →

관련 항목