web-dev-qa-db-fra.com

Fils SQL Server et degré de parallélisme

Ma compréhension concernant les threads SQL Server est que SQL Server décompose une demande d'exécution dans plusieurs tâches et associe chaque tâche avec un fil de travail. SO SQL Server essaie donc d'utiliser plusieurs threads (si disponibles et nécessaires) pour exécuter une requête, qu'il s'agisse d'une requête parallèle ou non parallèle.

Mais la déclaration suivante ( du livre Microsoft SQL Server 2012 Internals (MS Press) ) semble indiquer quelque chose de différent:

n plan d'exécution de la requête parallèle peut utiliser plusieurs threads; un plan d'exécution série utilisé par une requête non parallèle utilise uniquement un seul fil.

EDIT: Ma compréhension initiale est (probablement incorrecte) un planificateur peut (quand il ya un besoin), utilisez plusieurs travailleurs/threads du même nœud Numa pour traiter différentes tâches de la même demande d'exécution lorsqu'il s'agit d'une exécution en série.

Pour une exécution parallèle, plusieurs planificateurs/processeurs traiteraient la même demande d'exécution (qui est décomposé à plusieurs tâches) en même temps, et chacun des planificateurs utilisera (à nouveau, quand il ya un besoin) de multiples travailleurs/threads de leur noeud numa respectif.

En d'autres termes, parallèlement ou non, il y a une chance que plusieurs threads sont utilisés.

De toute évidence, il doit y avoir une faille dans ma compréhension initiale, mais je ne sais pas où se trouve la fausse idée. Est-ce que ma compréhension initiale ne s'applique que lorsque c'est un [~ # ~] parallèle [~ # ~ ~] Query étant exécuté?

Merci

3
John Smith

Ma compréhension initiale est (probablement incorrecte) un planificateur peut (lorsqu'il est nécessaire), utilisez plusieurs travailleurs/threads du même nœud numa pour traiter différentes tâches de la même demande d'exécution lorsqu'il s'agit d'une exécution en série.

Un plan de série n'utilisera pas plusieurs threads qu'il n'utilisera que le thread unique pour effectuer la tâche. Lorsque le série La requête commencerait qu'il serait lié à un planificateur et que le planificateur n'effectue aucune autre tâche à moins qu'il ne termine pas cette requête. Le planificateur peut attendre qu'un processus soit terminé, forçant ainsi la requête à attendre.

Il convient également de noter que le réglage MaxDop contrôle la quantité de fil utilisée pour le traitement parallèle et MaxDop est toujours spécifié par opérateur dans le plan d'exécution et non par plan d'exécution

Je vous suggère fortement de lire ci-dessous l'article par Paul White

compréhension et utilisation du parallélisme dans SQL Server

5
Shanky