Eu vejo a seguinte consulta em um Banco de Dados SQL do Azure (que tem Parametrização Forçada = FORCED, Parameter Sniffing = ON e Query Optimizer Fixes = ON) de dentro do Repositório de Consultas:
delete from [CMS_WebFarmTask]
where [TaskIsAnonymous] = @0
and [TaskID] not in ( select [TaskID] from [CMS_WebFarmServerTask] )
and [TaskCreated] < dateadd ( minute , @1 , getdate ( ) )
Possui um grande número de planos (17 na última hora), apesar de ambos os parâmetros serem inteiros com valores idênticos em cada plano:
<ParameterList>
<ColumnReference Column="@1" ParameterDataType="int" ParameterCompiledValue="(-3)" />
<ColumnReference Column="@0" ParameterDataType="int" ParameterCompiledValue="(0)" />
</ParameterList>
Por que apenas um plano não está sendo usado?
Parametrização forçada <> plano único forçado.
No entanto, o Repositório de Consultas tem um recurso para forçar um plano único, se é isso que você procura. Você pode ver o botão para isso diretamente na sua captura de tela.
Mas, se sua preocupação for mais geral sobre o motivo pelo qual você está recebendo vários planos, você deve começar certificando-se de que a mesma consulta esteja sendo executada todas as vezes. No seu caso, como você está usando
GETDATE()
, a consulta é realmente diferente toda vez que é executada, então eu não esperaria que ela produzisse o mesmo plano necessariamente com base apenas nisso.Você também precisa estar ciente do fato de que as estatísticas das tabelas subjacentes também podem mudar ao longo do tempo, o que pode afetar fortemente as estimativas do plano. Existem muitos outros fatores que contribuem para isso - este artigo se aprofunda no que entra em um plano de execução e o que pode afetá-lo. O banco de dados é uma coisa viva e a mudança de plano não deve ser inerentemente vista como algo ruim, a menos que esteja causando problemas óbvios de desempenho.