Por que um plano com otimização COMPLETA mostra uma parametrização simples?

Respostas:

7

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 parallelismmais 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 OPTIONdica de cláusula. O uso da OPTIONclá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
Erik Darling
fonte