Zuerst Run
die query
aus Sql Server Management Studio
und sehen Sie sich den Abfrageplan an, um zu sehen, wo der Engpass ist. An jeder Stelle, an der Sie einen "Tabellen-Scan" oder "Index-Scan" sehen, muss er alle Daten durchgehen, um zu finden, wonach er sucht. Wenn Sie geeignete Indizes erstellen, die für diese Operationen verwendet werden können, sollte dies die Leistung steigern.
Nachstehend finden Sie einige Tipps zur Verbesserung der Leistung von SQL-Abfragen.
Vermeiden Sie mehrere Joins in einer einzigen Abfrage
Versuchen Sie zu vermeiden, eine SQL-Abfrage mit mehreren Joins zu schreiben, die Outer Joins, Cross Apply, Outer Apply und andere komplexe Unterabfragen enthalten. Es reduziert die Auswahlmöglichkeiten für Optimizer, um die Join-Reihenfolge und den Join-Typ festzulegen. Manchmal ist Optimizer gezwungen, Nested-Loop-Joins zu verwenden, ungeachtet der Leistungsauswirkungen für Abfragen mit übermäßig komplexen Cross Apply- oder Unterabfragen.
Cursor aus der Abfrage entfernen Versuchen Sie, Cursor aus der Abfrage zu entfernen, und verwenden Sie eine mengenbasierte Abfrage. Eine mengenbasierte Abfrage ist effizienter als eine Cursor-basierte. Wenn ein Cursor verwendet werden muss, vermeiden Sie dynamische Cursor, da dies die Auswahl der für den Abfrageoptimierer verfügbaren Pläne einschränkt. Beispielsweise beschränkt der dynamische Cursor den Optimierer auf die Verwendung von Joins mit verschachtelten Schleifen.
Vermeiden Sie die Verwendung einer nicht korrelierten skalaren Unterabfrage Sie können Ihre Abfrage umschreiben, um eine nicht korrelierte skalare Unterabfrage als separate Abfrage anstelle eines Teils der Hauptabfrage zu entfernen, und die Ausgabe in einer Variablen speichern, auf die in der Hauptabfrage oder einem späteren Teil des Stapels verwiesen werden kann. Dadurch erhält Optimizer bessere Optionen, die dazu beitragen können, genaue Kardinalitätsschätzungen zusammen mit einem besseren Plan zurückzugeben.
Vermeiden Sie Tabellenwertfunktionen (TVFs) mit mehreren Anweisungen Multi-Statement-TVFs sind teurer als Inline-TFVs. SQL Server erweitert Inline-TFVs in die Hauptabfrage, so wie es Sichten erweitert, aber TVFs mit mehreren Anweisungen in einem von der Hauptabfrage getrennten Kontext auswertet und die Ergebnisse von mehreren Anweisungen in temporäre Arbeitstabellen materialisiert. Der separate Kontext und die Arbeitstabelle machen TVFs mit mehreren Anweisungen kostspielig.
Erstellen Sie einen höchst selektiven Index Selektivität definiert den Prozentsatz der qualifizierenden Zeilen in der Tabelle (qualifizierende Anzahl von Zeilen/Gesamtzahl von Zeilen). Wenn das Verhältnis der qualifizierenden Anzahl von Zeilen zur Gesamtanzahl von Zeilen niedrig ist, ist der Index sehr selektiv und am nützlichsten. Ein nicht gruppierter Index ist am nützlichsten, wenn das Verhältnis etwa 5 % oder weniger beträgt, was bedeutet, wenn der Index 95 % der Zeilen aus der Berücksichtigung ausschließen kann. Wenn index mehr als 5 % der Zeilen in einer Tabelle zurückgibt, wird er wahrscheinlich nicht verwendet; Entweder wird ein anderer Index gewählt oder erstellt oder die Tabelle wird gescannt.
Positioniere eine Spalte in einem Index Die Reihenfolge oder Position einer Spalte in einem Index spielt ebenfalls eine wichtige Rolle bei der Verbesserung der SQL-Abfrageleistung. Ein Index kann helfen, die SQL-Abfrageleistung zu verbessern, wenn die Kriterien der Abfrage mit den Spalten übereinstimmen, die im Indexschlüssel am weitesten links stehen. Als Best Practice sollten die meisten selektiven Spalten ganz links im Schlüssel eines nicht gruppierten Index platziert werden.
Nicht verwendete Indizes löschen Das Löschen nicht verwendeter Indizes kann dazu beitragen, Datenänderungen zu beschleunigen, ohne den Datenabruf zu beeinträchtigen. Außerdem müssen Sie eine Strategie für Batch-Prozesse definieren, die selten ausgeführt werden und bestimmte Indizes verwenden. In solchen Fällen hilft das Erstellen von Indizes vor Batch-Prozessen und das anschließende Löschen, wenn die Batch-Prozesse abgeschlossen sind, den Aufwand für die Datenbank zu reduzieren.
Erstellung und Aktualisierung von Statistiken Sie müssen sich um die Statistikerstellung und regelmäßige Aktualisierungen für berechnete Spalten und Mehrfachspalten kümmern, auf die in der Abfrage verwiesen wird; Der Abfrageoptimierer verwendet Informationen über die Verteilung von Werten in einer oder mehreren Spalten einer Tabellenstatistik, um die Kardinalität oder Anzahl der Zeilen im Abfrageergebnis zu schätzen. Diese Kardinalitätsschätzungen ermöglichen es dem Abfrageoptimierer, einen qualitativ hochwertigen Abfrageplan zu erstellen.
Überprüfen Sie Ihre Schemadefinitionen Überprüfen Sie zu guter Letzt noch einmal Ihre Schemadefinitionen. Achten Sie darauf, ob die entsprechenden FORIGEN KEY-, NOT NULL- und CEHCK-Einschränkungen vorhanden sind oder nicht. Die Verfügbarkeit der richtigen Einschränkung an der richtigen Stelle hilft immer, die Abfrageleistung zu verbessern, so wie die FORIGEN KEY-Einschränkung hilft, Joins zu vereinfachen, indem einige äußere oder Semi-Joins in innere Joins umgewandelt werden, und die CHECK-Einschränkung hilft auch ein wenig, indem sie unnötige oder redundante Prädikate entfernt.