Eu tenho uma DELETE
declaração em execução em uma tabela com uma coluna indexada de texto completo, um punhado de chaves estrangeiras cascade
habilitadas. Se parece com isso:
DELETE FROM dbo.STUDENTS WHERE STUDENTID=@STUDENTID
Ocasionalmente, é compilado um plano que inclui estimativas de linha muito altas para todas as operações de índice, de modo que DELETE
leva muito tempo e causa bloqueio.
Eu tentei forçar um bom plano no QueryStore, mas isso não funciona, last forced plan failure description
mostrando NO_PLAN
.
Assegurei-me de que não há alterações de esquema que possam invalidar o plano.
Olhando para o plano de execução, vejo que DELETE
envolve uma junção a uma tabela do sistema que contém o índice FT:
Essa associação ao índice FT significa que a imposição de plano não é suportada?
Ao olhar para as limitações de forçar o plano, um dos pontos principais é:
No entanto , essa limitação não significa que uma exclusão deva falhar na imposição do plano.
Considere estas 4 consultas, duas
SELECT
declarações e duasDELETE
declarações em uma tabela com um índice de texto completo naval
coluna:A única consulta que está falhando é a 2ª, que está usando a
CONTAINS
instrução:Com o motivo da falha sendo
DQ_NO_FORCING_SUPPORTED
.Os planos para as duas instruções de exclusão, que também mostram os mesmos
clustered index merge
operadores, são forçados:Esta fonte fornece mais informações sobre
DQ_NO_FORCING_SUPPORTED
:Para responder a pergunta
Minha resposta seria que esse não é o motivo, pois você deve ver o erro
DQ_NO_FORCING_SUPPORTED
em vez doNO_PLAN
erro. O motivo pode ser devido a outra limitação que torna o plano inválido, alterações de índice, chaves estrangeiras adicionadas, ....Testes extras
Ao adicionar uma tabela e criar uma chave estrangeira com cascata de exclusão que faz referência à tabela usada nas consultas acima. Esperamos que a exclusão falhe, pois não podemos mais usar o plano forçado.
Como esperado, obtemos
NO_PLAN
as duas instruções de exclusãoReforçar os planos nos dá a salvação:
E remove o
NO_PLAN
problemaO mesmo vale para uma tabela com um índice de texto completo que possui uma chave estrangeira (com cascata de exclusão) que faz referência à tabela principal em que a consulta de exclusão está sendo executada.
Em relação às estimativas altas/baixas
Se a exclusão não for executada muito, a adição
OPTION(RECOMPILE)
pode ajudar com as estimativas de linhas altas, pois isso pode fornecer uma estimativa melhor devido ao otimizador 'ver' a variável em tempo de execução.Postar uma pergunta diferente com o plano de consulta pode trazer uma solução alternativa/solução diferente.