Pourquoi un plan avec optimisation complète affiche-t-il un paramétrage simple?

Réponses:

7

Un paramétrage simple est tenté lorsqu'un plan trivial est trouvé. La tentative de paramétrage peut être considérée comme sûre ou non sûre .

Le point clé est qu'un plan trivial est trouvé et considéré comme sûr . Si le coût du plan trivial dépasse le cost threshold for parallelism, l'optimiseur passera aux étapes ultérieures d'optimisation, où des plans parallèles peuvent être envisagés. Que le résultat final soit un plan série ou parallèle, il sera simple paramétré si le plan trivial sûr trouvé ( mais pas finalement utilisé ) a été paramétré.

Dans l'exemple de question, la définition d'un prix cost threshold for parallelismsupérieur au coût du plan trivial permettra à l'optimiseur de s'arrêter à ce stade.


L'examen du plan de requête n'est pas toujours suffisant pour déterminer si votre requête a réellement été paramétrée simplement.

Le moyen le plus sûr est de vérifier certains DMV pour vérifier:

/*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';

En outre, vous pouvez également utiliser l'indicateur de trace non documenté 8607, mais pas comme OPTIONindicateur de clause. L'utilisation de la OPTIONclause empêche 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 le plan est considéré comme sûr pour le paramétrage simple, vous verrez un message le confirmant ici.

********************

** Query marked as Cachable

** Query marked as Safe for Auto-Param
Erik Darling
la source