Die größten Leistungsherausforderungen in SQL Server

Microsoft SQL
Performance Monitor
28/8/2024
Tomasz Chwasewicz
Die schwierigsten Leistungsherausforderungen von SQL Server
Inhaltsverzeichniss

SQL Server hat unter den Stars der Konferenzräume einen ausgezeichneten Ruf. Es wird für seine Architektur und seine Fähigkeit gelobt, riesige Datensätze mit der Anmut von jemandem zu jonglieren, der ziemlich gut jonglieren kann. Diejenigen, die tatsächlich mit Daten zu kämpfen haben, kennen jedoch ein anderes Märchen. Sie wissen, dass SQL Server, wie jeder mächtige Gigant, seine eigenen Überraschungen und Überraschungen bereithält, die Datenbankprofis auf Trab halten können. Schauen wir uns also die gravierendsten Leistungsherausforderungen bei SQL Server an.

1. Parameter-Sniffing — Wahrnehmbare Probleme

Sniffing-Parameter hat einen ziemlich spezifischen Charakter. Es taucht auf, wenn Sie es am wenigsten erwarten, und bringt eine eigentlich einfache Aufgabe durcheinander. Warum? SQL Server versucht intelligent zu sein — manchmal zu schlau. Durchsucht Abfrageparameter, um einen optimalen Ausführungsplan zu erstellen. Das Problem beginnt, wenn SQL Server unabhängig von nachfolgenden Änderungen an einem Plan festhält.

Wenn Sie eine Abfrage einmal ausführen, analysiert SQL Server die Parameter sorgfältig. Einen Plan zu erstellen ist großartig. Aber wenn später andere Parameter ins Spiel kommen, weigert sich SQL Server, stur wie ein altes Maultier, sein Verhalten zu ändern. Er verwendet den gleichen alten Plan, auch wenn klar ist, dass dies nicht der richtige Weg ist.

Dies kann zu einer Leistung führen, die so unberechenbar ist wie eine Taube auf der Station. Manchmal ist alles in Ordnung und die Abfrage funktioniert wie ein Traum. In anderen Fällen ist es eine Katastrophe, die Sie beim Indexieren verlangsamt, wenn Sie es sich am wenigsten leisten können.

Wie gehe ich mit Parameter Sniffing um?

  • Zur Laufzeit neu aufbauen: Fügen Sie der Abfrage eine OPTION (RECOMPILE) -Klausel hinzu. Dadurch wird SQL Server gezwungen, für jede Ausführung einen neuen Ausführungsplan zu generieren, der die aktuellen Parameterwerte berücksichtigt. Dies ist nützlich für Abfragen, die nicht sehr oft ausgeführt werden, bei deren Ausführung jedoch eine optimale Leistung erforderlich ist.
  • Optimiere für das Unbekannte: Implementieren Sie die OPTION-Klausel (OPTIMIZE FOR UNKNOWN) in Ihren Abfragen. Dadurch wird SQL Server angewiesen, die anfänglichen Parameterwerte zu ignorieren und einen allgemeineren Plan zu generieren, der keinen bestimmten Parameterwerten entspricht. Dies kann bei Abfragen effektiv sein, bei denen sich Parameterwerte häufig und über einen weiten Bereich ändern.
  • Verwenden Sie die Planleitfäden: Erstellen Sie Roadmap-Guides, um die Ausführung der Abfrage zu beeinflussen, ohne den eigentlichen SQL-Code zu ändern. Mithilfe von Planleitfäden können Sie genau festlegen, welcher Ausführungsplan von SQL Server in bestimmten Szenarien verwendet werden soll. So können Sie die Leistung kontrollieren, ohne den Anwendungscode zu ändern.
  • Das Design der Abfrage anpassen: Teilen Sie komplexe Abfragen in einfachere Unterabfragen auf oder geben Sie temporäre Tabellen ein, um Zwischenergebnisse zu speichern. Diese Änderungen können die Komplexität von SQL Server bei der Optimierung von Abfragen reduzieren und so verhindern, dass aufgrund von Parameter-Sniffing schlechte Pläne ausgewählt wurden.

2. Verarbeitung komplexer Ereignisse

Die Verwaltung der Ereignisverarbeitung kann schwierig sein, insbesondere wenn es um Technologien wie Service Broker oder StreamInsight geht. Diese Tools eignen sich hervorragend für den Umgang mit Datenströmen in Echtzeit und komplexer Ereignisverarbeitung, was theoretisch gut klingt. In der Praxis können sie jedoch die Leistung von SQL Server erheblich beeinträchtigen, wenn sie nicht ordnungsgemäß verwaltet werden. Es ist ein bisschen so, als würde man eine große Party schmeißen, aber vergessen, genug Personal einzustellen, um Bestellungen zu bearbeiten und Leckereien zuzubereiten.

Das Hauptproblem besteht darin, dass die Verwaltung dieser Ereignisse einen angemessenen Teil der Aufmerksamkeit von SQL Server erfordert — Ressourcen, die sich sonst um die Verarbeitung von Standardabfragen kümmern könnten. Wenn der Server damit beschäftigt ist, mit dem Fluss der Ereignisse Schritt zu halten, stellen Sie möglicherweise fest, dass alles andere langsamer wird.

So verwalten Sie den Aufwand für die Ereignisverarbeitung:

  • Optimieren Sie den Umgang mit Ereignissen: Optimieren Sie die Prozesse, die Ereignisse verarbeiten. Sie können beispielsweise sicherstellen, dass die Service Broker-Warteschlangen nicht mit Nachrichten überlastet werden. Überwachen und verwalten Sie diese Warteschlangen regelmäßig, um zu verhindern, dass sie sich ansammeln, was das gesamte System verlangsamen kann.
  • Skalierung: Manchmal ist es am besten, einen Großteil der Eventverarbeitung abzuwickeln, nicht alles auf einen Server zu legen. Stattdessen müssen Sie die Last auf mehrere Server oder Instanzen verteilen. Das kann bedeuten, dedizierte Instanzen für intensive Aufgaben der Ereignisverarbeitung zu erstellen.
  • Asynchrone Verarbeitung: Behandeln Sie Ereignisse nach Möglichkeit asynchron. Dadurch wird verhindert, dass der SQL-Server mit synchronen Aufgaben überlastet wird, die andere Vorgänge unterbrechen könnten. Durch die asynchrone Verarbeitung kann das System atmen und erstickt nicht unter Druck.
  • Zuteilung von Ressourcen: Verwenden Sie das Tool SQL Server Resource Governor, um bestimmten Ressourcen der Verarbeitung von Ereignissen zuzuweisen. Indem Sie Grenzwerte für die CPU- oder Speichernutzung für Event-Handler festlegen, behalten Sie sich eine Reserve für andere wichtige Datenbankoperationen vor.

3. Unsachgemäße Verwaltung der Speicherzuweisungen

Speicher ist etwas, von dem wir uns alle wünschen, wir hätten nur mit zunehmendem Alter mehr davon gehabt, und SQL Server ist da keine Ausnahme. Sie liebt ihr Gedächtnis, manchmal sogar zu sehr, besonders wenn es um ihre Spenden geht. Speicherzuweisungen sind wie kleine Versprechen, die SQL Server bei Abfragen macht, um sicherzustellen, dass Sie über die Ressourcen verfügen, die Sie für Ihre Arbeit benötigen. Aber genau wie zu viele Versprechen in der realen Welt können auch zu hohe Versprechungen in der SQL Server-Abteilung zu einer ganzen Reihe von SQL Server-Leistungsproblemen führen.

Wenn SQL Server diese Speicherzuweisungen falsch verwaltet, weist er Abfragen, die ihn nicht unbedingt benötigen, zu viel Speicher zu. Infolgedessen bleiben große Teile des Speichers ungenutzt und für andere Prozesse gesperrt, die ihn möglicherweise benötigen. Dies führt zu einem Szenario, in dem einige Abfragen mehr Speicher als nötig erhalten, während andere mit unzureichendem Speicher zu kämpfen haben, wodurch das gesamte System verlangsamt wird.

Wie beherrsche ich SQL-Speichergewohnheiten?

  • Richtige Indizierung und Abfragedesign: Oft ist die Ursache für übermäßige Speicherzuweisungen ein schlechtes Abfragedesign oder eine unzureichende Indizierung. Durch die Optimierung dieser beiden Elemente kann SQL Server die Menge an Arbeitsspeicher, die eine Abfrage wirklich benötigt, genauer vorhersagen und zuweisen, anstatt einfach den großzügigen und unnötigen Umfang zu erhöhen.
  • Anpassen der Konfigurationseinstellungen: Passen Sie Einstellungen an, die die Größe des zugewiesenen Speichers steuern, z. B. den maximalen Serverspeicher und den Mindestspeicher pro Anfrage. Es ist ein bisschen so, als ob man Richtlinien festlegt, wie viel jeder an einem Buffet essen darf; nicht genug und sie werden hungrig gehen, zu viel und es entsteht Verschwendung.
  • Überwachung und Anpassung: Verwenden Sie Dynamic Management Views (DMV), um den tatsächlichen Speicherverbrauch im Auge zu behalten. Achten Sie auf Anzeichen übermäßiger Zuschüsse und ausstehender Anfragen. Es ist ein bisschen so, als würde man den Verkehrsfluss überwachen. Wenn Sie einen Stau sehen, ist es an der Zeit, einen Teil dieses Verkehrs umzuleiten.
  • Ressourcenmanagement: Implementieren Sie die Ressourcenverwaltung in SQL Server, um die Speichermenge zu begrenzen, die von einzelnen Abfragen oder Anwendungen verwendet werden kann. Es ist, als würde man Teenagern sagen, dass sie nur ein bestimmtes Limit bekommen; sie müssen lernen, innerhalb dieser Grenzen zu budgetieren.

4. Auswirkungen von Ad-hoc-Abfragen

Ad-hoc-Abfragen sind Platzhalter. Es ist schwer zu sagen, welche zu Leistungsproblemen in SQL Server führen werden. Sie treten unerwartet auf, verursacht durch plötzliche Anforderungen oder einmalige Ereignisse. Sie sind wie Gäste, die unangekündigt zum Abendessen vorbeikommen. Es ist zwar gut, sie zu empfangen, aber zu viele unerwartete Gäste können das System wirklich belasten.

Ad-hoc-Abfragen werden naturgemäß nicht im Voraus geplant oder optimiert. Sie können von Ausführung zu Ausführung stark variieren, was es für SQL Server schwierig macht, Ressourcen effizient vorherzusagen und zu verwalten. Das Ergebnis? Diese können zur sogenannten Plan-Cache-Kontamination führen. Dies passiert, wenn der Server versucht, einen Cache mit Ausführungsplänen zu speichern, aber am Ende zu viele verfügbare Pläne speichert und die am häufigsten benötigten verdrängt werden.

Wie minimiere ich die Auswirkungen von Ad-hoc-Abfragen auf SQL Server?

  • Verwenden Sie gespeicherte Prozeduren: Fördern Sie die Verwendung von gespeicherten Prozeduren anstelle von Ad-hoc-Abfragen. Gespeicherte Prozeduren werden im Voraus kompiliert und optimiert, was bedeutet, dass SQL Server sie effizienter ausführen kann als Ad-hoc-SQL-Anweisungen.
  • Parametrisierung aktivieren: Dies hilft SQL Server, ähnliche Ad-hoc-Abfragen als identisch zu behandeln, auch wenn sie sich in den Literalen geringfügig unterscheiden. Durch die Parametrisierung von Abfragen kann SQL Server Ausführungspläne effektiver wiederverwenden, wodurch der Aufwand reduziert und die Leistung verbessert wird.
  • Begrenzung und Überwachung: Überwachen Sie die Verwendung von Ad-hoc-Abfragen mit Geeignete Werkzeugeund setze sogar einige Grenzen, wer sie wie oft ausführen kann. Es geht nicht darum, geizig zu sein — es geht darum, ein gesundes Gleichgewicht im System aufrechtzuerhalten.
  • Tipps zur Optimierung von Abfragen: Manchmal lassen sich Ad-hoc-Abfragen nicht vermeiden. In diesen Fällen kann SQL Server mithilfe von Tipps zur Abfrageoptimierung besser verstehen, wie diese Abfragen besser optimiert und ihre Auswirkungen möglicherweise reduziert werden können.

5. Probleme beim Konfigurieren von Resource Governor

Resource Governor ist eine SQL Server-Funktion, mit der die Menge an CPU und Arbeitsspeicher gesteuert werden kann, die eingehende Anwendungen verwenden können. Es wurde entwickelt, um die Verwaltung von Serverressourcen zu erleichtern, indem es Grenzwerte für ressourcenintensive Operationen festlegt. Aber wie jedes leistungsstarke Tool erfordert es eine sorgfältige Handhabung, da es sonst zu mehr Leistungsproblemen für SQL Server führen kann, als es löst.

Die Leistungsherausforderungen in SQL Server im Zusammenhang mit Resource Governor liegen in seiner Konfiguration. Falsche Einstellungen können zu einer Unterzuweisung von Ressourcen führen, wodurch wichtige Aufgaben gedrosselt werden und die Leistung sinkt, oder zu einer Überbelegung, was auch nicht besser ist, da dadurch andere wichtige Prozesse beeinträchtigt werden können.

Wie vermeide ich Probleme mit der Resource Governor-Konfiguration?

  • Richtige Klassifizierung der Lasten: Der erste Schritt besteht darin, eingehende Ladungen genau zu klassifizieren. SQL Server verwendet zu diesem Zweck Klassifiziererfunktionen. Wenn diese Funktionen nicht präzise sind, können sie Lasten fehlleiten, was zu einer ineffizienten Ressourcenzuweisung führt.
  • Einstellungen für den Ressourcenpool: Sobald die Workloads klassifiziert sind, werden sie an verschiedene Ressourcenpools weitergeleitet. Die Einstellungen dieser Pools — maximaler und minimaler Prozessor, Arbeitsspeicher und IOPS — müssen sorgfältig konfiguriert werden. Wenn Sie diese Parameter zu hoch oder zu niedrig einstellen, kann dies die Leistung nicht nur einzelner Anwendungen, sondern auch des gesamten Servers ernsthaft beeinträchtigen.
  • Überwachung und Anpassung: Die Effektivität der Resource Governor-Einstellungen lässt sich nicht einfach festlegen und vergessen. Eine kontinuierliche Überwachung ist entscheidend, um die Auswirkungen dieser Einstellungen zu verstehen und sie auf der Grundlage der aktuellen Last- und Leistungsdaten anzupassen.
  • Die Grenzen verstehen: Es ist wichtig, die Grenzen dessen zu kennen, was der Resource Governor tun kann und was nicht. Dies ist ein hervorragendes Tool für die CPU- und Speicherverwaltung, aber es ist nicht für die Unterstützung von Netzwerk-I/O-Vorgängen oder die Behebung von Festplatten-I/O-Vorgängen konzipiert. Missverständnisse in dieser Hinsicht können zu falschen Erwartungen und unzureichenden Lösungen führen.

6. Konkurrenz für TempDB

Von temporären Tabellen und Sortierungen bis hin zu Versionsspeichern — in TempDB wickelt SQL Server all Ihre internen Arbeiten und Operationen ab. Das Problem ist, dass es von allen Benutzern, allen Datenbanken und allen Sitzungen in der Instanz gemeinsam genutzt wird. Wenn also alle gleichzeitig ins Zentrum gehen müssen, tritt eine Blockade auf.

Wenn zu viele Aufgaben TempDB-Ressourcen benötigen, entsteht Wettbewerb. Diese Art der Überlastung ist nicht nur ein kleiner Fehler, sondern kann die Systemleistung erheblich beeinträchtigen, was zu Leistungsproblemen in SQL Server führen kann. Die Aufgaben stellen sich in eine Warteschlange und warten darauf, dass sie an der Reihe sind, um auf TempDB zuzugreifen.

Wie gehe ich mit der Konkurrenz um TempDB um?

  • Hinzufügen von Datendateien: Manchmal ist es am besten, mehr Spuren hinzuzufügen, um mit Bewegung umzugehen. Ebenso kann das Hinzufügen weiterer Datendateien zu TempDB dazu beitragen, die I/O-Last auf mehrere Dateien zu verteilen und so die Konkurrenz um Festplattenressourcen zu verringern.
  • Code-Optimierung: Vermeiden Sie unnötig große temporäre Tabellen oder Cursor, die TempDB belasten können. Überprüfen und verfeinern Sie Ihren Code, um sicherzustellen, dass TempDB effektiv verwendet wird. Das ist vergleichbar mit der Förderung von Mitfahrgelegenheiten; je weniger Autos auf der Straße sind, desto besser ist der Verkehrsfluss.
  • Richtige Konfiguration: Stellen Sie sicher, dass TempDB optimal für Ihre Arbeitslast konfiguriert ist. Dies beinhaltet die Festlegung der geeigneten Anfangsgröße, der Wachstumsstufen und der Platzierung der Dateien, ähnlich wie bei der Planung einer effektiven Stadtentwicklung.

7. Allgemeine Kosten für die Verschlüsselung

Keine Sicherheitsmaßnahme ist kostenlos. Die Verschlüsselung stellt SQL Server vor erheblichen Rechenaufwand und Leistungsproblemen, da alle Daten verschlüsselt werden müssen, bevor sie geschrieben und entschlüsselt werden können, bevor sie gelesen werden können. Diese zusätzlichen Berechnungen stellen zusätzliche Leistungsherausforderungen in SQL Server dar, die sich auf Folgendes auswirken:

  • CPU-Auslastung: Verschlüsselungsalgorithmen benötigen Prozessorzyklen, um Klartext in verschlüsselten Text umzuwandeln und umgekehrt. Je mehr Daten Sie verschlüsseln müssen, desto mehr CPU-Ressourcen werden verbraucht. Dies kann besonders in Umgebungen wichtig sein, in denen große Datenmengen ständig verfügbar sind und aktualisiert werden.
  • I/O-Verzögerungen: Wenn Daten verschlüsselt werden, werden sie häufig erweitert, was bedeutet, dass verschlüsselte Daten mehr Speicherplatz beanspruchen können als ihr unverschlüsseltes Gegenstück. Diese Erhöhung der Datengröße kann zu zusätzlichen Eingabe-/Ausgabevorgängen führen, die die Lese- und Schreibvorgänge im Festplattenspeicher verlangsamen können. Da Daten vor dem Schreiben verschlüsselt und nach dem Lesen wieder entschlüsselt werden müssen, kommen zusätzliche Schritte hinzu, die die Transaktionszeit verlängern.
  • Speicherbelastung: SQL Server speichert die Daten in seinem Pufferpool zwischen, aber die verschlüsselten Daten müssen entschlüsselt werden, wenn sie in den Arbeitsspeicher geladen werden, und möglicherweise erneut verschlüsselt, wenn sie erneut auf die Festplatte geschrieben werden. Dieser Prozess kann mehr Speicherressourcen beanspruchen als die Verarbeitung unverschlüsselter Daten, da durch Verschlüsselung einige der Optimierungen verhindert werden können, die SQL Server mit Klartextdaten durchführen kann.
  • Schlüsselverwaltung: Die Verwaltung von Verschlüsselungsschlüsseln bringt auch Mehraufwand mit sich. Jedes Mal, wenn wir Daten verschlüsseln oder entschlüsseln müssen, müssen wir auf den entsprechenden Schlüssel zugreifen. Wenn die Schlüsselverwaltungspraktiken nicht optimal sind, kann dies zu erheblichen Verzögerungen führen, insbesondere wenn sich die Schlüssel außerhalb des Standorts oder in einem zentralen Schlüsselverwaltungsdienst befinden, der Zugriff auf das Netzwerk erfordert.

Die durch die Verschlüsselung verursachten Leistungsherausforderungen für SQL Server können je nach Art der implementierten Verschlüsselung variieren:

  • Transparente Datenverschlüsselung (TDE): TDE verschlüsselt den Speicher der gesamten Datenbank und führt I/O-Verschlüsselung und Entschlüsselung von Daten und Protokolldateien in Echtzeit durch. Die Auswirkungen auf die CPU-Leistung sind im Allgemeinen geringer als bei der Verschlüsselung auf Spaltenebene, da sie in das SQL Server-Datenbankmodul integriert ist und für datenbankweite Operationen optimiert ist.
  • Verschlüsselung auf Spaltenebene: Diese Methode verschlüsselt bestimmte Datenspalten und erfordert mehr CPU-Ressourcen, da jedes Datenelement in der Spalte einzeln auf Spaltenebene ver- und entschlüsselt werden muss. Sie bietet eine höhere Sicherheit für vertrauliche Daten, allerdings auf Kosten einer größeren Beeinträchtigung der Leistung.

So verwalten Sie die Auswirkungen der Verschlüsselung auf SQL Server

  • Wählen Sie den entsprechenden Verschlüsselungstyp
  • Abwägen von Sicherheits- und Leistungsanforderungen: Nicht alle Daten erfordern das gleiche Sicherheitsniveau. Indem Sie nur die sensibelsten Daten verschlüsseln, anstatt sie in großem Umfang zu verwenden, können Sie die Auswirkungen auf die Leistung minimieren und gleichzeitig wichtige Daten schützen.

In Verbindung stehende Artikel