SQL-Abfrageleistung

In diesem speziellen Fall werden Sie keinen großen Unterschied bemerken, da 30.000 Zeilen für die Datenbank nicht zu schwer zu verarbeiten sind. Wenn Sie jedoch von Hunderten von Millionen Zeilen oder mehr sprechen, sehen Sie eine spürbare Verbesserung, wenn Sie vor dem Beitritt aggregieren. Wenn Sie dies tun, stellen Sie sicher, dass das, was Sie tun, logisch konsistent ist — Sie sollten sich um die Genauigkeit Ihrer Arbeit sorgen, bevor Sie sich um die Laufgeschwindigkeit sorgen.

13 TIPPS ZUR ABFRAGELEISTUNG

Denken Sie daran, Objektnamen (z. b. Tabelle, gespeicherte Prozedur, Ansicht) mit ihrem Eigentümer-/Schemanamen.

Grund: Wenn der Eigentümer-/Schemaname nicht angegeben wird, versucht das SQL Server-Modul, ihn in allen Schemas zu finden, bis das Objekt ihn findet. SQL Server Engine sucht nicht nach der Tabelle außerhalb ihres Besitzers/Schemas, wenn der Besitzer / Schemaname angegeben wird.

Der Operator *

Verwenden Sie den Operator * nicht in Ihren SELECT-Anweisungen. Verwenden Sie stattdessen Spaltennamen.

Grund: SQL Server sucht nach allen Spaltennamen und ersetzt das * durch alle Spaltennamen der Tabelle(n) in der SQL SELECT-Anweisung. Die Bereitstellung von Spaltennamen vermeidet dieses Suchen und Ersetzen und verbessert die Leistung.

Nullfähige Spalten

Vermeiden Sie die Verwendung von NOT IN beim Vergleich mit nullfähigen Spalten. Verwenden Sie stattdessen NOT EXISTS .

Grund: Wenn NOT IN in der Abfrage verwendet wird (auch wenn die Abfrage keine Zeilen mit den Nullwerten zurückgibt), überprüft SQL Server jedes Ergebnis, um festzustellen, ob es null ist oder nicht. Die Verwendung von NOT EXISTS führt den Vergleich mit NULLEN nicht durch. Außerdem gibt NOT EXISTS nur zwei Zustände (true oder false) zurück, während NOT IN bis zu drei Zustände (true, false, NULL) zurückgeben kann und möglicherweise nicht das erwartete Ergebnis liefert.

Tabellenvariablen und Joins

Vermeiden Sie die Verwendung von Tabellenvariablen in Joins. Verwenden Sie stattdessen temporäre Tabellen, CTEs (Common Table Expressions) oder abgeleitete Tabellen in Joins.

Grund: Obwohl Tabellenvariablen in vielen Situationen sehr schnell und effizient sind, sieht das SQL Server-Modul sie als einzelne Zeile. Aus diesem Grund erstellt SQL einen Ausführungsplan, der bei Verwendung in Joins eine schreckliche Leistung erbringt.

Namen gespeicherter Prozeduren

Beginnen Sie den Namen Ihrer gespeicherten Prozedur nicht mit sp_ .

Grund: Wenn die gespeicherte Prozedur sp_ oder SP_ heißt, prüft SQL Server immer die System- / Masterdatenbank, auch wenn der Eigentümer- / Schemaname angegeben ist. Die Angabe eines Namens ohne SP_ für eine gespeicherte Prozedur vermeidet diese unnötige Prüfung in der System- / Masterdatenbank in SQL Server.

Verwenden Sie SET NOCOUNT ON

Verwenden Sie SET NOCOUNT ON mit DML-Operationen.

Grund: Beim Ausführen von DML-Operationen (z. B. EINFÜGEN, LÖSCHEN, AUSWÄHLEN und AKTUALISIEREN), gibt SQL Server immer die Anzahl der betroffenen Zeilen zurück. In komplexen Abfragen mit vielen Joins wird dies zu einem großen Leistungsproblem. Die Verwendung von SET NOCOUNT ON verbessert die Leistung, da die Anzahl der betroffenen Zeilen nicht nachverfolgt wird.

Vermeiden Sie GROUP BY, ORDER BY und DISTINCT

Vermeiden Sie GROUP BY, ORDER BY und DISTINCT wann immer möglich.

Grund: Bei Verwendung von GROUP BY, ORDER BY oder DISTINCT erstellt das SQL Server-Modul eine Arbeitstabelle und legt die Daten in der Arbeitstabelle ab. Danach organisiert es diese Daten in der Arbeitstabelle, wie von der Abfrage angefordert, und gibt dann das Endergebnis zurück.

Indizes prüfen

Es sollten Indizes für alle Felder vorhanden sein, die in den WHERE- und JOIN-Abschnitten der SQL-Anweisung verwendet werden.

Grund: Wenn Felder nicht indiziert sind, führt SQL Server normalerweise einen vollständigen Tabellenscan durch, was die Leistung beeinträchtigen kann. Wenn die Tabelle nicht sehr klein ist, führt ein Tabellenscan tendenziell zu der schlechtesten Leistung aller Arten von Datenbanklesungen.

Verwenden Sie denselben Datentyp für JOIN- und WHERE-Klauseln

Dies ist einfacher gesagt als getan, abhängig von Ihren Berechtigungen zum Vornehmen von Änderungen am Schema.

Grund: Wenn Sie zwei Felder mit unterschiedlichen Datentypen verknüpfen oder vergleichen, muss SQL eine sofortige Konvertierung des Felds durchführen, bevor ein Vergleich durchgeführt werden kann, selbst wenn die Felder indiziert sind. Wenn nicht übereinstimmende Datentypen unvermeidlich sind, versuchen Sie, den größeren Datentyp nach Möglichkeit in den kleineren Datentyp umzuwandeln.

Vermeiden Sie die Verwendung berechneter Felder in JOIN- und WHERE-Klauseln

Dazu können Sie ein Feld mit den berechneten Werten erstellen, die im Join in der Tabelle verwendet werden. Siehe unten.

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht.