web-dev-qa-db-fra.com

MAXDOP = 1, conseils de requête et seuil de coût pour le parallélisme

Si une instance a MAXDOP définie sur 1 et que les indices de requête sont utilisés pour permettre à des requêtes spécifiques de se mettre 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 oui ou non se mettre en parallèle?

Je n'ai pas été en mesure de déterrer ces informations spécifiques bien que ce lien suggère que CTFP est ignoré si MAXDOP est 1. Cela a du sens sans conseils de requête car aucune demande, quel que soit le coût , deviendra parallèle lorsque MAXDOP est égal à 1.

Quelqu'un peut-il me faire savoir quel sera le comportement attendu de ces deux demandes?

Exemple 1:

Instance Maxdop: 1 
CTFP: 50 
Query hint: Maxdop=2 
Query cost: 30

Exemple 2:

Instance Maxdop: 1
CTFP: 50
Query hint: Maxdop=2
Query cost: 70
11
Martin Bansey

Si une instance a MAXDOP définie sur 1 et que les indices de requête sont utilisés pour permettre à des requêtes spécifiques de se mettre 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 oui ou non se mettre en parallèle?

Réponse simple: oui .

Détails

Il y a quelques choses distinctes qui se passent ici, qu'il est important de séparer:

  1. Quel est le efficace degré maximum de parallélisme disponible à une requête?

    Les contributeurs à cela sont (globalement par ordre d'importance):

    • Gouverneur de ressources MAX_DOP réglage
    • Indice de requête MAXDOP paramètre
    • Le max degree of parallelism option de configuration d'instance

    Les détails sont expliqués dans paramètre "Max Degree of Parallelism" du serveur, MAX_DOP du gouverneur de ressources et indice de requête MAXDOP - lequel devrait utiliser SQL Server? par Jack Li, ingénieur principal en escalade pour le service client Microsoft SQL Server et Soutien. Le tableau ci-dessous est reproduit à partir de ce lien:

    parallelism table

  2. Un plan de requête utilisera-t-il le parallélisme?

    L'optimiseur de requêtes SQL Server trouve 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 le cost threshold for parallelism valeur de configuration


    ... l'optimiseur va essayer pour 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: le cost threshold for parallelism affecte uniquement 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 un plan série le moins cher coût de 30, SQL Server ne ((== --- ==) pas essayez de trouver un plan parallèle. Un plan de série sera produit.

Exemple 2

Étant donné le CTFP de 50 et un plan série le moins cher trouvé coût de 70, SQL Server cherchera essayez pour 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: parallèle série ou . L'optimiseur ne trouve qu'un plan série dans les phases search0 (TP) et search1 (QP).

Il mai puis (comme décrit) réexécute 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 dans le cas où l'optimisation passe à search2 (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

20
Paul White 9

Exemple 1 Instance Maxdop: 1 CTFP: 50 Indice de requête: Maxdop = 2 Coût de la requête: 30

L'indicateur de requête MAXDOP remplace le degré maximal de parallélisme définissant l'instance à l'échelle, mais comme le CTPF est de 50 et le coût de la requête est de 30, il peut aller pour le plan série.

Exemple 2 Instance Maxdop: 1 CTFP: 50 Indice de requête: Maxdop = 2 Coût de la requête: 70

Ici encore, le degré maximum de parallélisme sera pris comme 2 puisque l'indication MAXDOP est là mais CTFP sera pris comme 50 et la requête, si possible comme Paul l'a mentionné, peut fonctionner en parallèle.

Si MAXDOP est défini sur 1 dans une instance et que des indices de requête sont utilisés pour permettre à des requêtes spécifiques de se dérouler 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 ou non être parallèle?

indice MAXDOP remplacera le paramètre à l'échelle de l'instance du degré maximal de parallélisme.

Citation de documents de conseil MAXDOP Microsoft

Numéro MAXDOP S'applique à: SQL Server 2008 à SQL Server 2017.

Substitue l'option de configuration du degré maximal de parallélisme de sp_configure et du gouverneur de ressources pour la requête spécifiant cette option. L'indicateur de requête MAXDOP peut dépasser la valeur configurée avec sp_configure. Si MAXDOP dépasse la valeur configurée avec le gouverneur de ressources, le moteur de base de données utilise la valeur MAXDOP du gouverneur de ressources,

2
Shanky