Die Übernahme einer guten SQL-Syntax und Vorgehensweisen beim Schreiben von Abfragen verbessert die Effektivität Ihrer Datenbanküberwachung und als Ergebnis die Gesamtleistung Ihrer Datenbank. Es gibt mehrere erprobte Möglichkeiten, die Datenbankleistung durch Syntax- und Abfrageanpassungen zu verbessern. Wir haben 5 ausgewählt, auf die wir uns konzentrieren möchten.
1. CASE-Ausdrücke
Hier sind ein paar Best Practices, um mit CASE-Ausdrücken die beste Leistung zu erzielen:
- CASE-Ausdrücke verbessern die Leistung, indem sie alten prozeduralen Code in deklarativen Code verschieben, der dann optimiert werden kann. Verwenden Sie für grundlegende CASE-Ausdrücke
, was am einfachsten optimiert werden kann. Für erweiterte CASE-Ausdrücke sind Hashing und andere Techniken am nützlichsten. - Da WHEN-Klauseln von links nach rechts getestet werden, ist es am besten, Ihre Klauseln so anzuordnen, dass die wahrscheinlichsten zuerst aufgelistet werden. Dadurch wird der Zeitaufwand für unnötiges Scannen reduziert.
- Die meisten Optimierer schließen auch redundante Tests aus, indem sie die Reihenfolge der Ausführung berücksichtigen. Sobald eine WHEN-Klausel ausgeführt wird, muss diese Klausel nicht erneut getestet werden. Viele Optimierer sind jedoch nicht gut darin, verschachtelte CASE-Ausdrücke zu lesen, daher ist es am besten, sie auf eine einzige Ebene zu reduzieren.
2. Double-Dipping und die Window-Klausel
In SQL bedeutet „Double-Dipping“, dass dieselbe Tabelle mehr als einmal besucht wird, was Ihre Abfrage erheblich verlangsamt. Versuchen Sie im Idealfall, alle Ihre Aufgaben in einem einzigen Tischbesuch zu erledigen. Aber wenn das nicht möglich ist, gibt es einige Möglichkeiten, die Auswirkungen auf die Leistung zu mindern.
Die Verwendung von temporären Tabellen, die aus derselben Basistabelle erstellt wurden, die miteinander verbunden sind, ist wirklich nicht der beste Weg, um doppeltes Eintauchen zu vermeiden. Eine bessere Lösung besteht darin, den Optimierer Ihrer SQL-Engine zu verwenden, um VIEWs anzuzeigen und die Ergebnisse als Arbeitstabelle zu teilen.
Wenn Sie auf einen weniger als herausragenden Optimierer beschränkt sind, verwenden Sie temporäre Tabellen und erledigen Sie die Arbeit manuell.
Obwohl die oben genannten Methoden vollkommen akzeptabel sind, ist der beste Weg, doppeltes Eintauchen zu vermeiden, die Verwendung der Fensterklausel, da die Unterklauseln ähnlich wie Unterabfragefunktionen funktionieren. Zum Beispiel:
- Die PARTITION BY-Klausel ist wie ein lokales GROUP BY, das die Tabelle in Gruppierungen aufteilt.
- Die ORDER BY-Klausel erzwingt eine sortierte Reihenfolge.
- Der Fensterrahmen (ROW oder RANGE) ist wie eine lokale WHERE-Klausel.
Sie können die Fensterfunktionen optimieren, indem Sie diese Regeln befolgen:
- Sortieren Sie im Index zuerst nach den Spalten der PARTITION BY-Klausel und dann nach den Spalten, die in der ORDER BY-Klausel verwendet werden.
- Schließen Sie jede andere Spalte, auf die in der Abfrage verwiesen wird, als eingeschlossene Spalten des Indexes ein.
3. Verwenden Sie gespeicherte Prozeduren
Objektrelationale Mapper (ORMs) verursachen zahlreiche Leistungsprobleme, wenn sie ihren eigenen Code generieren. Wenn Sie ORMs verwenden müssen, schreiben Sie Ihre eigenen gespeicherten Prozeduren, damit die Leistung nicht darunter leidet.
Es gibt viele Möglichkeiten, wie gespeicherte Prozeduren die Leistung verbessern, einschließlich:
- Sie übertragen weniger Daten über das Netzwerk, daher sind Transaktionen schneller
- Sie ermöglichen kürzere Anrufe
- Gespeicherte Prozeduren lassen sich in Profil-Tools leichter nachverfolgen
- Da eine gespeicherte Prozedur ein tatsächliches Objekt in Ihrer Datenbank ist, ist es einfacher, Leistungsstatistiken abzurufen, wodurch es einfacher wird, Leistungsprobleme zu finden
- Die Wiederverwendung von Ausführungsplänen nimmt zu
- Sie erleichtern den Umgang mit Randfällen und fügen Überwachungs- oder Änderungssperrverhalten hinzu
- Gespeicherte Prozeduren sind nicht anfällig für SQL-Injection-Angriffe
4. LÖSCHEN und AKTUALISIEREN in Batches
Das Löschen oder Aktualisieren vieler Daten aus einem großen Tabellenscan verbraucht viele Ressourcen, da beide Anweisungen als eine einzige Transaktion ausgeführt werden. Dies ist ein Leistungskiller, denn wenn ein Fehler auftritt, während die Transaktion ausgeführt wird und Sie sie stoppen müssen, muss das System die gesamte Transaktion rückgängig machen. Das Zurücksetzen großer Datenmengen nimmt viel Zeit in Anspruch und blockiert andere Transaktionen.
Sie können dieses Leistungsproblem vermeiden, indem Sie Aktualisierungen und Löschungen in kleinen Stapeln durchführen. Wenn Sie diese Transaktionen in Stapeln ausführen und die Transaktion beendet wird, ist das Rollback viel geringer. Das Zurücksetzen einer kleinen Datenmenge dauert nicht sehr lange, und andere Transaktionen können Arbeit leisten, während der Stapel auf die Festplatte übertragen wird.
5. Rufen Sie nicht mehr Spalten ab, als Sie benötigen
Einer der Hauptgründe für schlecht ausgeführte Abfragen ist das Abrufen irrelevanter Spalten. Vermeiden Sie Vorgehensweisen, die häufig dazu führen, dass eine übermäßige Anzahl von Spalten zurückgegeben wird. Beachten Sie Folgendes:
- Die unnötige Verwendung von „SELECT *“ in einer Abfrage wird wahrscheinlich mehr Spalten zurückgeben, als Sie benötigen. Dies ist eine Verschwendung von Ressourcen und sperrt Ressourcen von anderen Benutzern. Es ist besonders wichtig, in spaltenorientierten SQL-Datenbanken nicht wahllos „SELECT *“ zu verwenden.
- Ausschneiden und Einfügen zur Wiederverwendung von Code kann zu überflüssigen Spalten führen.
- Wenn Sie eine VIEW aufrufen, erhalten Sie möglicherweise verschachtelte Spalten. Entschachteln Sie Abfragen mit schlechter Leistung, um zu überprüfen, welche Spalten vorhanden sind, und entfernen Sie übergroße Spalten, die Sie nicht benötigen. Ein guter Hinweis auf ein Problem ist, dass Sie eine WHERE-Klausel mit zusätzlichen Bedingungen und eine FROM-Klausel mit zusätzlichen Outer Joins haben.
Dies sind nur einige der Möglichkeiten, wie ein gewissenhafter Umgang mit der SQL-Syntax und dem Schreiben von Abfragen die Datenbanküberwachung verbessern kann. Scheuen Sie sich nicht, andere auszuprobieren. Eine leistungsstarke Datenbank ist der Schlüssel zum Erreichen der Geschäftsziele in jeder Organisation.