La parametrización simple se intenta cuando se encuentra un plan trivial . El intento de parametrización puede considerarse seguro o inseguro .
El punto clave es que un plan trivial se encontró y se considera segura . Si el costo del plan trivial excede el cost threshold for parallelism
, el optimizador pasará a etapas posteriores de optimización, donde se pueden considerar planes paralelos. Ya sea que el resultado final sea un plan en serie o paralelo, será simple parametrizado si el plan trivial seguro encontrado ( pero no utilizado en última instancia ) fue parametrizado.
En el ejemplo de la pregunta, establecer cost threshold for parallelism
un costo superior al costo del plan trivial permitirá que el optimizador se detenga en esa etapa.
Mirar el plan de consulta no siempre es suficiente para determinar si su consulta ha sido realmente simple parametrizada.
La forma más segura es verificar algunos DMV 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';
Además, también puede usar el indicador de rastreo no documentado 8607, pero no como una OPTION
sugerencia de cláusula. Usar la OPTION
cláusula previene un plan 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);
Si el plan se considera seguro para la parametrización simple, verá un mensaje que lo confirma aquí.
********************
** Query marked as Cachable
** Query marked as Safe for Auto-Param