bonjour
Ce billet évoque le parallélisme, et tout particulièrement le type d’attente CXPACKET
Détection d’un CXPACKET
La meilleure façon de détecter ce type d’attente est d’utiliser la DMV sys.dm_os_wait_stats :
Comment résoudre les problèmes d’attentes CXPACKET ?
CXPACKET élevé => parallélisme => passer le a 1
Note : La valeur 0 signifie que le serveur détermine le degré maximal de parallélisme à utiliser
Sur une machine multiprocesseur il est normal d’avoir du CXPACKET. mais Lorsque ça dépasse le 80% des attentes et que ça peut être corrélé avec une charge CPU importante, alors oui il faut regarder les requêtes qui parallélisent.
Il faut bien se souvenir que la raison pour laquelle l’optimiseur décide de compiler un plan parallèle, c’est d’abord le coût. Donc il faut en premier s’attaquer à cette question, pourquoi les requêtes coûtent si cher ? (manque d’index ,index trop fragmenté,statistique obsolète …)
Ci joint une imprime écran sur quel colonne il faut pointer pour changer la valeur max degré du parallélisme
en mode transact
sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
sp_configure 'max degree of parallelism', 8;
GO
RECONFIGURE WITH OVERRIDE;
GO
|
noter bien que certaines personnes recommandent une valeur de « max degree of parallelism » égale au nombre de processeurs divisés par 2 Exemple pour 16 processeurs, maxdop = 8 il faut ajuster cette valeur en faisant des tests de performance
sur le plan d’exécution du requête tu aurai ce type d’affichage (deux flèches avec un couleur jaune)
il est aussi possible de fixer le MAXDOP au niveau de la requête
|
SELECT ...
FROM...
...
OPTION (MAXDOP 1)
|
Pour trouver les requêtes ayant fait du parallélisme, utilisez cette requête :
SELECT TOP 10 text AS SQL_REQUEST, query_plan AS EXECUTION_PLAN
FROM sys.dm_exec_query_stats AS s WITH(NOLOCK)
CROSS APPLY sys.dm_exec_query_plan(s.plan_handle) p
CROSS APPLY sys.dm_exec_sql_text(s.plan_handle) AS q
WHERE p.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
max(//p:RelOp/@Parallel)', 'float') > 0
ORDER BY total_worker_time/execution_count DESC
OPTION (MAXDOP 1);
Dans tous les cas, avant de désactiver définitivement le parallélisme, un audit général est recommandé
Pour plus information, David Baffaleuf a fait récemment une session très complète sur le parallélisme dans SQL Server
https://www.youtube.com/watch?v=6ywngaqLjsg
cordialement