A parametrização simples é tentada quando um plano trivial é encontrado. A tentativa de parametrização pode ser considerada segura ou não .
O ponto principal é que um plano trivial seja encontrado e considerado seguro . Se o custo do plano trivial exceder o cost threshold for parallelism
, o otimizador continuará nos estágios posteriores da otimização, onde planos paralelos podem ser considerados. Se o resultado final for um plano serial ou paralelo, será simples parametrizar se o plano trivial seguro encontrado ( mas não usado em última análise ) tiver sido parametrizado.
No exemplo da pergunta, definir o valor cost threshold for parallelism
mais alto que o custo do plano trivial permitirá que o otimizador pare nesse estágio.
Analisar o plano de consulta nem sempre é suficiente para descobrir se sua consulta foi realmente com parâmetros simples.
A maneira mais segura é verificar algumas DMVs para verificar:
/*Unsafe auto param*/
SELECT *
FROM sys.dm_os_performance_counters AS dopc
WHERE dopc.counter_name LIKE '%Unsafe Auto-Params/sec%';
/*Safe auto param*/
SELECT *
FROM sys.dm_os_performance_counters AS dopc
WHERE dopc.counter_name LIKE '%Safe Auto-Params/sec%';
/*Trivial Plans*/
SELECT *
FROM sys.dm_exec_query_optimizer_info AS deqoi
WHERE deqoi.counter = 'trivial plan';
Além disso, você também pode usar o sinalizador de rastreamento não documentado 8607, mas não como uma OPTION
dica de cláusula. O uso da OPTION
cláusula impede um plano trivial.
DBCC TRACEON(8607, 3604);
/*Wait*/
/*Run*/
SELECT u.CreationDate, u.Id
FROM dbo.Users AS u
WHERE u.Reputation = 2;
/*Clean up*/
DBCC TRACEOFF(8607, 3604);
Se o plano for considerado seguro para Parametrização Simples, você verá uma mensagem confirmando aqui.
********************
** Query marked as Cachable
** Query marked as Safe for Auto-Param