Konfigurieren der installierten SQL-Server Instanz

Prozessor-Konfiguration

Standardmäßig wird eine installierte SQL-Server Instanz so konfiguriert, dass diese alle verfügbaren Prozessoren verwendet. Diese Einstellung sollte, sofern es sich um einen Server mit nur einer physikalischen CPU handelt, so beibehalten werden. Eine Änderung dieser Einstellung macht in diesem Szenario nur sinn, wenn in dem Server eine CPU mit sehr vielen Kernen verbaut ist und man die Kerne für CPU- bzw. I/O-Aufgaben explizit verteilen möchte.
Für mich macht dies an dieser Stelle nur Sinn, wenn es sich um OLAP-Datenbanken handelt, welche im Gegensatz zu OLTP-Datenbanken eine deutlich höhere I/O-Leistung vom Server verlangen.

Parallelisierung

Bei Systemen mit mehreren physikalischen Prozessoren sollte die Parallelitätseinstellung angepasst werden, um die optimale Leistung zu erhalten.

Max Degree of Parallelism

Bei Multi-Prozessor-Systemen ist das Parallelisieren von Abfragen über mehrere Prozessoren von Nachteil, da es sehr teuer ist, einen Thread von einem (physikalischen) Prozessor auf einen anderen zu transferieren, da beide Prozessoren in NUMA (Non-Unified Memory Access)-Systemen keinen gemeinsamen Speicher haben und somit der Speicher des Threads von einem zum anderen Prozessor transferiert werden muss, was zeitintensiv ist.

Bei Verwendung der neuen AMD Epic-Prozessoren wird diese Einstellung in Zukunft auch wichtig.

Um den Transfer eines Verarbeitungsthreads von einem auf den anderen Prozessor zu vermeiden, muss man die Einstellung „Max Degree of Parallelism“ auf den jeweiligen Server abstimmen. Handelt es sich zum Beispiel bei den im Server verbauten Prozessoren um zwei Quad-Core-Prozessoren welche Hyperthreading unterstützen, ist die Parallelitätseinstellung auf 8 zu setzen. Dieser Wert ergibt sich aus den vier physikalischen zuzüglich der vier virtuellen Cores welche von jeweils einem Prozessor zur Verfügung gestellt werden. Für die Datenbankengine bedeutet diese Einstellung, dass ein Abfrage maximal auf acht Threads aufgeteilt werden, welche dann auch alle auf einem physikalischen Prozessor abgearbeitet werden.

Cost Threshold for Parallelism

Die zweite wichtige Einstellung im Bereich der parallelen Abfrageabarbeitung ist die Einstellung „Cost Threshold for Parallelism“. Der Werst dieser Einstellung gibt an, ab welchen Kosten die Datenbankengine Ausführungspläne parallel ausführt. Der Standardwert ist 5. Ist der Wert von CXPACKED zu hoch, sollte dieser Wert auf 20 oder sogar 50 gesetzt werden, da Parallelisierung immer viel Overhead bedeutet und in einer OLTP-Datenbank eigentlich nur kleine Abfragen laufen sollten, bei denen sich die Parallelisierung negativ auswirkt.

Memory-Konfiguration

Als nächstes müssen die Memory-Einstellungen der SQL Server Instanz angepasst werden. Standardmäßig ist hier die Einstellung so gewählt, dass der SQL-Dienst sämtlichen Arbeitsspeicher des Systems verwenden kann.

Memory Pressure vom OS

Memory Pressure vom Betriebssystem bedeutet, das das Betriebssystem den SQL Server auffordert, Speicher frei zu geben, da dem Betriebssystem der Speicher ausgeht. Reagiert der SQL-Server nicht schnell genug auf diese Anforderung, wird der Inhalt des Buffer-Pools gepaged, d.h. der Buffer-Pool wird in die Auslagerungsdatei ausgelagert, was einen deutlichen Performance-Einbruch zur Folge hat. Somit sollte immer genügen freier Speicher für das Betriebssystem eingeplant werden. (min. 300MB freier Speicher).

Als Faustformel kann man folgende Werte als Anhaltspunkte verwenden:

  • bei 32GB RAM, der SQL Server Instanz 27GB zuweisen
  • bei 16GB RAM, der SQL Server Instanz 13GB zuweisen

Je nach Ausstattung des Systems und weiterer installierter Software auf dem SQL-Server sind die Maximalwerte des vom SQL-Server zu verwendenden Arbeitsspeichers anzupassen.

Die entsprechenden Einstellungen werden auf Instanzebene gemacht, man findet die Einstellung des maximal von der Instanz zu verwendenden Arbeitsspeicher unter der Page „Memory“. Hier trägt man in der Einstellung „Maximum server memory (in MB)“ den gewünschten Wert ein.

Zudem sollte der Wert der Einstellung „Minimum server memory (in MB)“ auf 50% des Maximum-Wertes eingestellt werden.