Maximaler Grad an Parallelität – MAX DEGREE OF PARALLELISM (MAXDOP) anpassen
Wenn Sie beim Konfigurieren einer SQL Server-Instanz die Servereigenschaften aufrufen, stoßen Sie auf den maximalen Grad an Parallelität, der standardmäßig auf 0 eingestellt ist. Man passt diesen Wert nur selten an – doch in diesem Beitrag erfahren Sie, wann und warum Sie das machen sollten.
Der MAXDOP Wert steht standardmäßig auf 0 (unbegrenzt). Diese Option steuert die Anzahl der Prozessoren, die für die Ausführung einer Abfrage verwendet werden. Dabei ermittelt dieser Wert die benötigten Rechen– und Thread-Ressourcen für die parallelen Operatoren eines Ausführungsplans.
Standardmäßig verwendet der SQL Server alle verfügbaren CPUs während einer Abfrage. Dies ist auch grundsätzlich super für große und komplexe Querys.
Jedoch kann die Standardeinstellung zu Performance-Einbußen bei anderen parallel laufenden Prozessen und Abfragen führen und die Anzahl parallel laufender Abfragen verringern.
Daher sollten Sie hier einen festen Wert eintragen, der sich nach der Anzahl ihrer CPUs, NUMA Knoten und Sockel richtet und auch danach ob beispielsweise Hyper-Threading aktiviert ist oder nicht.
Der englischsprachige Microsoft-Support-Artikel „Recommendations and guidelines for the „max degree of parallelism“ configuration option in SQL Server“ beschreibt die grobe Formel für den einzustellenden MAXDOP-Wert.
Folgendes lässt sich daraus zusammenfassen:
- Server mit 1x NUMA node und weniger als 8 log. Prozessoren -> setze MAXDOP auf die Anzahl der log. Prozessoren oder darunter
- Server mit 1x NUMA node und mehr als 8 log. Prozessoren -> setze MAXDOP nicht höher als 8
- Server mit mehreren NUMA nodes und weniger als 8 log. Prozessoren pro NUMA -> setze MAXDOP auf die Anzahl der log. Prozessoren pro NUMA oder darunter
- Server mit mehreren NUMA nodes und mehr als 8 log. Prozessoren pro NUMA -> setze MAXDOP nicht höher als 8
Mit der folgenden Abfrage erhalten Sie alle nötigen Infos, um den MAXDOP-Wert für Ihren SQL Server zu berechnen:
select cpu_count as LogicalCPUs
,(cpu_count / hyperthread_ratio) as PhysicalCPUs
,case when cpu_count > hyperthread_ratio then 1 else 0 end as HTEnable
,(select count(distinct parent_node_id) from sys.dm_os_schedulers where [status] = 'VISIBLE ONLINE' and parent_node_id < 64) as NumberOfNUMA
,(select COUNT(parent_node_id) from sys.dm_os_schedulers where [status] = 'VISIBLE ONLINE' and parent_node_id < 64 group by parent_node_id) as LogicalCPUsPerNUMA
from sys.dm_os_sys_info
So sollten also alle parallel ablaufenden Prozesse und Abfragen optimal laufen. Viel Vergnügen!
Geschrieben von: Arthur Leinweber
Brauchen Sie noch einen Xpertenrat?