Si une instance est MAXDOP
définie sur 1 et que des indices de requête sont utilisés pour autoriser des requêtes spécifiques à aller en parallèle, la valeur du seuil de coût pour le parallélisme est-elle toujours utilisée par SQL pour décider si elle doit réellement aller en parallèle ou non?
Réponse simple: oui .
Détails
Il y a quelques choses distinctes qui se passent ici, qu'il est important de séparer:
Quel est le degré de parallélisme maximal effectif disponible pour une requête?
Les contributeurs à cela sont (globalement par ordre d'importance):
MAX_DOP
Réglage du gouverneur de ressources
- Soupçon requête
MAXDOP
paramètre
- L'
max degree of parallelism
option de configuration d'instance
Les détails sont expliqués dans le paramètre «Degré maximal de parallélisme» du serveur, MAX_DOP du gouverneur de ressources et l'indicateur de requête MAXDOP - lequel SQL Server doit-il utiliser? par Jack Li, ingénieur principal en escalade pour le service client et le support Microsoft SQL Server. Le tableau ci-dessous est reproduit à partir de ce lien:
Un plan de requête utilisera-t-il le parallélisme?
L'optimiseur de requêtes SQL Server recherche toujours d'abord un plan série *.
Puis si:
- Une optimisation plus poussée est justifiée; et
- Le coût du meilleur plan série dépasse la
cost threshold for parallelism
valeur de configuration
... l'optimiseur va essayer de trouver un plan parallèle.
Puis si:
- Un plan parallèle est trouvé (c'est à dire possible); et
- Le coût du plan parallèle est inférieur au meilleur plan série
... un plan parallèle sera produit.
Remarque: la cost threshold for parallelism
seule influence si l'optimiseur recherche un plan parallèle. Une fois qu'un plan parallèle est mis en cache, il s'exécute en utilisant le parallélisme lorsqu'il est réutilisé (tant que les threads sont disponibles) quel que soit le paramètre CTFP.
Exemples
Pour les deux exemples, avec l'instance maxdop 1 et l'indicateur de requête maxdop 2, le DOP disponible effectif est 2. Si un plan parallèle est choisi, il utilisera DOP 2.
Exemple 1
Étant donné le CTFP de 50 et le coût de base d'un plan série le moins cher de 30, SQL Server n'essaiera pas de trouver un plan parallèle. Un plan de série sera produit.
Exemple 2
Étant donné le CTFP de 50 et le coût de base d'un plan série le moins cher de 70, SQL Server essaiera de trouver un plan parallèle. Si ce plan (s'il est trouvé) a un coût inférieur à 70 (le coût du plan de série), un plan parallèle sera produit.
Le résultat final de l'optimisation des requêtes est toujours un plan en cache unique: série ou parallèle. L'optimiseur ne trouve qu'un plan série dans les phases search0 (TP) et search1 (QP).
Il peut ensuite (comme décrit) réexécuter search1 avec la nécessité de produire un plan parallèle. Un choix est alors fait entre série et parallèle sur la base du meilleur coût du plan jusqu'à présent. Ce choix est contraignant au cas où l'optimisation passe à la recherche2 (optimisation complète). Chaque phase d'optimisation considère de nombreuses alternatives, mais la sortie d'une étape est toujours un plan unique optimal, qui est soit en série soit en parallèle.
J'ai écrit à ce sujet dans Mythe: SQL Server met en cache un plan série avec chaque plan parallèle