La parametrizzazione semplice viene tentata quando viene trovato un piano banale . Il tentativo di parametrizzazione può essere considerato sicuro o non sicuro .
Il punto chiave è che un piano banale viene trovato e considerato sicuro . Se il costo del piano banale supera il cost threshold for parallelism
, l'ottimizzatore passerà alle fasi successive di ottimizzazione, in cui è possibile prendere in considerazione piani paralleli. Se il risultato finale è un piano seriale o parallelo, sarà semplice parametrizzato se il piano banale sicuro trovato ( ma non utilizzato alla fine ) fosse parametrizzato.
Nell'esempio della domanda, l'impostazione di un cost threshold for parallelism
valore superiore al costo del piano banale consentirà all'ottimizzatore di arrestarsi in quella fase.
Esaminare il piano di query non è sempre sufficiente per capire se la query è stata effettivamente parametrizzata semplice.
Il modo più sicuro è controllare alcuni DMV per verificare:
/*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';
Inoltre, è possibile utilizzare anche il flag di traccia non documentato 8607, ma non come OPTION
suggerimento per una clausola. L'uso della OPTION
clausola impedisce un piano banale.
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 il piano è considerato sicuro per la parametrizzazione semplice, vedrai un messaggio che lo conferma qui.
********************
** Query marked as Cachable
** Query marked as Safe for Auto-Param