Vor einigen Jahren veröffentlichte Microsoft einen sehr nützlichen Knowledge Base-Artikel über die Konfiguration von SQL Server 2012 und SQL Server 2014 für die beste Leistung bei hoher Arbeitslast auf größerer, moderner Serverhardware. Mein Kollege Aaron Bertrand und ich hatten beide eine kleine Rolle bei der Überprüfung des ursprünglichen KB-Artikels. Dieser KB-Artikel wurde seitdem ziemlich aktuell gehalten und ist immer noch eine großartige Referenz für nützliche Konfigurationsoptionen für SQL Server 2012/2014.
Seitdem hat Microsoft auch eine Reihe sehr nützlicher Leistungsverbesserungen von SQL Server 2016 auf SQL Server 2012 und SQL Server 2014 zurückportiert, solange Sie auf einem ausreichend neuen Build sind einer dieser älteren Versionen von SQL Server. Microsoft empfiehlt, dass Sie sowohl Service Packs als auch kumulative Updates proaktiv bereitstellen, um die Wahrscheinlichkeit zu minimieren, dass Probleme auftreten, die in späteren Builds von SQL Server behoben wurden.
Als zusätzlichen Bonus erhalten Sie auch neue Funktionen und andere Verbesserungen, wie ich sie in diesem Artikel beschreibe. In den meisten Fällen müssen Sie ein Ablaufverfolgungsflag aktivieren, um von diesen Leistungsverbesserungen zu profitieren.
Dirty-Page-Manager
Das erste ist die Verwendung von Dirty Page Manager (DPM) in Verbindung mit der Aktivierung indirekter Prüfpunkte für Ihre Benutzer- und Systemdatenbanken in SQL Server 2012 und SQL Server 2014. Indirekte Prüfpunkte sind die Standardeinstellung für neue Datenbanken, die auf SQL Server 2016 erstellt wurden, und das ist die empfohlene Konfiguration für SQL Server 2016-Instanzen.
Wenn Sie das globale Trace Flag 3449 aktivieren (und Sie verwenden SQL Server 2012 SP3 CU3 oder höher oder SQL Server 2014 SP1 CU7 oder höher), erhalten Sie eine viel bessere Leistung, indem Sie einen FlushCache-Aufruf in einer Reihe verschiedener gängiger Szenarien vermeiden, z. Erstellen einer Datenbank, Hinzufügen einer Datei zu einer Datenbank, Wiederherstellen einer Datenbank, Verkleinern einer Datenbankdatei und während eines „ordnungsgemäßen“ Herunterfahrens von SQL Server. Das Ablaufverfolgungsflag 3449 wird sofort wirksam, ohne dass ein Neustart erforderlich ist. Sie sollten auch TF 3449 als Startup-Trace-Flag setzen.
Das Vermeiden dieser FlushCache-Aufrufe ist besonders wichtig, wenn Ihr Datenbankserver über viel RAM (mehr als 256 GB) verfügt, wobei der Vorteil mit der Größe Ihres verwendeten Pufferpools zunimmt. Weitere Informationen zu dieser Verbesserung finden Sie in diesem Blogbeitrag:
Wenn Sie SQL Server 2012 SP4 oder SQL Server 2014 SP2 (oder höher) verwenden, erhalten Sie als Nächstes eine Reihe weiterer neuer Leistungsverbesserungen, wie z. B. automatische Soft-NUMA-Partitionierung und dynamische Speicherobjektskalierung, die ursprünglich in SQL Server 2016 eingeführt wurden .
Automatische Soft-NUMA-Partitionierung
Sowohl in SQL Server 2012 SP4 als auch in SQL Server 2014 SP2, wenn Sie Trace Flag 8079 setzen Als Trace-Flag beim Start scannt SQL Server das Hardware-Layout während des Engine-Starts und konfiguriert automatisch Soft NUMA auf Systemen, die 8 oder mehr physische Kerne pro NUMA-Knoten melden. Das automatische Soft-NUMA-Verhalten ist Hyperthreading (HT/logischer Prozessor) bewusst, was bedeutet, dass es sowohl mit Intel Hyper-Threading als auch mit AMD SMT funktioniert. Bei der Bestimmung des optimalen Soft-NUMA-Knotenlayouts werden die logischen CPU-Informationen abgefragt und verwendet, um Gruppierungen von rein logischen und rein physikalischen Knoten zu verhindern, die zu Leistungsschwankungen über die Soft-NUMA-Knoten hinweg führen könnten.
Aktuelle Serverprozessoren können bis zu 32 physische Kerne in einem einzelnen NUMA-Knoten haben, was SMP-ähnliche Skalierbarkeitsprobleme innerhalb eines einzelnen Hardware-NUMA-Knotens aufdecken kann. Microsoft behauptet, dass sie eine spürbare Leistungsverbesserung durch diese Funktion sehen, indem sie ihren internen SQL Server 2016-Testrahmen verwenden:
"Mit HT-fähigem Auto-Soft-NUMA erzielen wir bis zu 30 % mehr Abfrageleistung, wenn DOP mithilfe von Automatic Soft NUMA auf die Anzahl der physischen Kerne auf einem Socket (in diesem Fall 12) eingestellt ist."
Wie immer ist es eine gute Idee, die Leistung Ihrer Workload mit Automatic Soft NUMA zu testen, bevor Sie sie in der Produktion verwenden.
Dynamische Speicherobjektskalierung
Sowohl in SQL Server 2012 SP4 als auch in SQL Server 2014 SP2 partitioniert SQL Server Arbeitsspeicherobjekte basierend auf der Anzahl der NUMA-Knoten und logischen Prozessorkerne dynamisch, um eine bessere Skalierung auf moderner Serverhardware zu ermöglichen. Das Ziel der dynamischen Heraufstufung besteht darin, ein Thread-sicheres Speicherobjekt (CMEMTHREAD) automatisch zu partitionieren, wenn es zu einem Engpass wird.
Unpartitionierte Speicherobjekte werden dynamisch heraufgestuft, um durch NUMA-Knoten partitioniert zu werden (die Anzahl der Partitionen entspricht der Anzahl der NUMA-Knoten), basierend auf der Arbeitslast und dem Engpass, und durch NUMA-Knoten partitionierte Speicherobjekte können weiter heraufgestuft werden, um durch logische CPU-Kerne partitioniert zu werden (Die Anzahl der Partitionen entspricht der Anzahl der logischen CPU-Kerne). Diese Erweiterung macht das Ablaufverfolgungsflag 8048 überflüssig, sobald Sie SQL 2014 SP2 oder SQL Server 2012 SP4 installiert haben.
SOS_RWLock Spinlock-Verbesserung
In SQL Server 2014 SP2 gibt es Verbesserungen (wieder rückportiert von SQL Server 2016), die Spinlocks für SOS_RWLock-Operationen überflüssig machen. Microsoft beschreibt diese Verbesserung detaillierter wie folgt:
"SOS_RWLock ist ein Synchronisierungsprimitive, das an verschiedenen Stellen in der SQL Server-Codebasis verwendet wird. Wie der Name schon sagt, kann der Code mehrere gemeinsam genutzte (Leser) oder einzelne (Schreiber) Eigentümer haben. Diese Verbesserung macht Spinlock für SOS_RWLock überflüssig und verwendet stattdessen Lock-freie Techniken ähnlich wie In-Memory-OLTP. Mit dieser Änderung können viele Threads eine durch SOS_RWLock geschützte Datenstruktur parallel lesen, ohne sich gegenseitig zu blockieren, und dadurch eine erhöhte Skalierbarkeit bieten. Vor dieser Änderung erlaubte die ältere Spinlock-Implementierung nur einen Thread den SOS_RWLock auf einmal erwerben, sogar um eine Datenstruktur zu lesen."
Sie erhalten außerdem eine Reihe nützlicher Verbesserungen der Verwaltbarkeit in SQL Server 2012 SP4 und SQL Server 2014 SP2. Weitere Informationen zu diesen Verbesserungen finden Sie in diesen Blogbeiträgen:
- SQL Server 2012 Service Pack 4 (SP4) veröffentlicht!
- SQL Server 2014 Service Pack 2 ist jetzt verfügbar !!!
Die wichtigste Erkenntnis aus all dem ist, dass Sie, wenn Sie SQL Server 2012 ausführen (das am 11. Juli 2017 aus dem Mainstream-Support fiel), SQL Server 2012 SP4 verwenden möchten, während Sie, wenn Sie SQL Server 2014 ausführen, Sie möchten auf SQL Server 2014 SP2 oder neuer sein. Sie müssen auch die entsprechenden Trace-Flags aktivieren und die relevanten Datenbankeigenschaften festlegen, um diese Verbesserungen nutzen zu können.