Eu forcei um plano no armazenamento de consultas da seguinte forma
EXEC sys.sp_query_store_force_plan @query_id = 113366, @plan_id = 3687662
mas quando executo a consulta novamente, a consulta não usa o plano, nem mostra umfailure_force_reason
A consulta a seguir mostra que o plano foi forçado e não sugere nenhuma falha em forçar na última execução
SELECT plan_id,
query_id,
is_forced_plan,
last_force_failure_reason_desc
FROM sys.query_store_plan
WHERE is_forced_plan = 1
A consulta a seguir mostra o último tempo de execução da consulta em questão, isso me confirma que foi realmente essa consulta que executei novamente e que usou um plano diferente daquele que forcei:
SELECT TOP 1
q.query_id,
p.plan_id,
s.last_execution_time,
SYSDATETIMEOFFSET() AS CurrentTime
FROM sys.query_store_query q
JOIN sys.query_store_plan p
ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats s
ON s.plan_id = p.plan_id
WHERE q.query_id = 113366
ORDER BY s.last_execution_time DESC
Por que o query store parece ignorar essa força de plano? Existem eventos estendidos ou outras ferramentas de solução de problemas que eu possa aproveitar para entender?
O plano que ele usa é semelhante ao que você está tentando forçar?
Forçar o plano não garante que o plano exato será forçado. Ainda pode usar um plano moralmente equivalente.
Trecho da documentação (ênfase minha):
Kendra Little escreve sobre isso em detalhes.