Grundlegendes zu Statistiken, Ausführungsplänen und dem aufsteigenden Schlüsselproblem

11

Ich versuche, die Beziehung zwischen Statistiken, Ausführungsplänen und der Ausführung gespeicherter Prozeduren (konzeptionell) besser zu verstehen.

Stimmt es, dass Statistiken nur beim Erstellen des Ausführungsplans für eine gespeicherte Prozedur verwendet werden und nicht im tatsächlichen Ausführungskontext verwendet werden? Mit anderen Worten, wenn dies zutrifft, wie wichtig sind "aktuelle" Statistiken, sobald der Plan erstellt wurde (und vorausgesetzt, er wird ordnungsgemäß wiederverwendet)?

Besonders motiviert hat mich ein Artikel, den ich gelesen habe ( Statistiken, Zeilenschätzungen und Spalte mit aufsteigendem Datum ), der ein Szenario beschreibt, das einem Szenario sehr ähnlich ist, dem ich täglich mit mehreren Datenbanken unserer Kunden gegenüberstehe.

Wir haben eine aufsteigende Datums- / Zeitspalte in einer unserer größten Tabellen, die wir regelmäßig mit einer bestimmten gespeicherten Prozedur abfragen.

Wie verhindern Sie, dass Ausführungspläne veralten, wenn täglich hunderttausend Zeilen hinzugefügt werden?

Wenn wir Statistiken häufig aktualisieren, um dieses Problem zu bekämpfen, ist es sinnvoll, den Hinweis OPTION (RECOMPILE) für die Abfrage dieser gespeicherten Prozedur zu verwenden?

Jeder Rat oder jede Empfehlung wäre dankbar.

Update : Ich verwende SQL Server 2012 (SP1).

John Russell
quelle

Antworten:

5

Stimmt es, dass Statistiken nur beim Erstellen des Ausführungsplans für eine gespeicherte Prozedur verwendet werden und nicht im tatsächlichen Ausführungskontext verwendet werden?

Nein, der Ausführungsplan für eine gespeicherte Prozedur wird zwischengespeichert. Angenommen, es ist genügend Speicher verfügbar, um den Plan weiterhin zu speichern, ändert sich dies nur, wenn eine der folgenden Situationen eintritt (aus dem Zwischenspeichern und Wiederverwenden von Ausführungsplänen in der SQL Server-Dokumentation, Hervorhebung hinzugefügt):

  • Änderungen an einer Tabelle oder Ansicht, auf die von der Abfrage verwiesen wird (ALTER TABLE und ALTER VIEW).
  • Änderungen an einer einzelnen Prozedur, durch die alle Pläne für diese Prozedur aus dem Cache gelöscht werden (ALTER PROCEDURE).
  • Änderungen an den vom Ausführungsplan verwendeten Indizes.
  • Aktualisierungen der vom Ausführungsplan verwendeten Statistiken, die entweder explizit aus einer Anweisung wie UPDATE STATISTICS generiert oder automatisch generiert werden.
  • Löschen eines vom Ausführungsplan verwendeten Index.
  • Ein expliziter Aufruf von sp_recompile.
  • Große Anzahl von Änderungen an Schlüsseln (generiert durch INSERT- oder DELETE-Anweisungen anderer Benutzer, die eine Tabelle ändern, auf die von der Abfrage verwiesen wird).
  • Bei Tabellen mit Triggern, wenn die Anzahl der Zeilen in den eingefügten oder gelöschten Tabellen erheblich zunimmt.
  • Ausführen einer gespeicherten Prozedur mit der Option WITH RECOMPILE.

Wenn die Statistiken aktualisiert werden, berücksichtigt der zwischengespeicherte Plan automatisch die neuen Statistiken und wird neu kompiliert.

Wie verhindern Sie, dass Ausführungspläne veralten, wenn täglich hunderttausend Zeilen hinzugefügt werden?

Eine Möglichkeit ist, wenn die Tabelle, wie oben erwähnt, viele Aktualisierungen enthält. Einige hunderttausend geänderte Zeilen können diese Bedingung erfüllen. Aber wenn Sie sicher sein oder eine genauere Kontrolle haben möchten: indem Sie Ihre Statistiken aktualisieren. Sie können SQL Server erlauben, Statistiken automatisch zu erstellen und zu verwalten oder dies manuell selbst zu tun. Weitere Informationen zu beiden Methoden finden Sie unter SQL Server Auto Update und Auto Create Statistics Options . Wenn Sie eine wöchentliche Neuerstellung von Indizes durchführen, werden auch die zu aktualisierenden Pläne ausgelöst. Führen Sie einige Tests durch, um festzustellen, was für Sie am vorteilhaftesten ist, da eine zu häufige Aktualisierung der Statistiken möglicherweise keine echten Leistungsergebnisse liefert.

Wenn wir Statistiken häufig aktualisieren, um dieses Problem zu bekämpfen, ist es sinnvoll, den Hinweis OPTION (RECOMPILE) für die Abfrage dieser gespeicherten Prozedur zu verwenden?

Sie müssen nicht brauchen zu verwenden RECOMPILE, aus dem Auszug seit basierend oben Sie , dass der Ausführungsplan entsprechend aktualisiert wird sehen können , wenn neue Statistiken zur Verfügung stehen. Möglicherweise ist eine Aktualisierung der Tagesendstatistik in Ordnung (wenn Sie wirklich besorgt sind), aber ich denke nicht, dass dies aufgrund Ihrer bisherigen Aussagen ausdrücklich erforderlich ist. Ich würde es jedoch erneut testen, um festzustellen, welche Auswirkungen dies auf die Leistung Ihrer gespeicherten Prozedur haben kann, und entsprechend planen.

LowlyDBA
quelle
RECOMPILEwürde sowieso kein Statistik-Update verursachen.
Martin Smith
@ MartinSmith Richtig! Ich werde bearbeiten, um das klarer zu machen.
LowlyDBA
@ LowlyDBA könnten Sie sich auf das folgende Thema beziehen? dba.stackexchange.com/questions/207475/…
lukaszwinski
6

Stimmt es, dass Statistiken nur beim Erstellen des Ausführungsplans verwendet werden?

Nein, veraltete Statistiken können zu einer optimalen Neukompilierung der betroffenen Anweisung führen.

Wir haben eine aufsteigende Datums- / Zeitspalte in einer unserer größten Tabellen, die wir regelmäßig abfragen

Suboptimale Ausführungspläne, die dadurch verursacht werden, dass Prädikatwerte außerhalb (speziell über) dem im entsprechenden Statistikhistogramm gespeicherten Wertebereich liegen, werden als aufsteigendes Schlüsselproblem bezeichnet . Die Neuerstellung von Statistiken ist eine mögliche Lösung, kann jedoch sehr ressourcenintensiv sein. Alternativen sind:

  • Verfolgen Sie die Flags 2389 und 2390 . Dies erfordert, dass ein Index mit der problematischen Spalte als Leitschlüssel vorhanden ist. Es funktioniert nicht mit partitionierten Tabellen und ist in SQL Server 2014 nur wirksam, wenn der ursprüngliche Kardinalitätsschätzer verwendet wird. Das Ablaufverfolgungsflag 4139 kann auch erforderlich sein, wenn das Statistikobjekt als stationär gekennzeichnet ist.

  • Upgrade auf SQL Server 2014. Der neue Kardinalitätsschätzer enthält eine Logik zum Schätzen über das Histogramm hinaus unter Verwendung von Informationen zur durchschnittlichen Dichte. Dies kann unter bestimmten Umständen weniger genau sein als die Trace-Flags 2389/2390.

  • Aktivieren Sie häufigere automatische Statistikaktualisierungen für große Tabellen mit dem Ablaufverfolgungsflag 2371 . Mit diesem Trace-Flag sind anstelle von Aktualisierungen nach 20% + 500 Änderungen nur SQRT(1000 * Table rows)Änderungen erforderlich. Dies ist keine so vollständige Lösung wie die zuvor genannten, da Aktualisierungen möglicherweise immer noch nicht oft genug ausgelöst werden.

Wenn die Ursache Ihres Problems nicht so häufig häufige Planerstellungen sind, die auf Prädikatwerten außerhalb des Histogramms basieren, sondern mehr über die Auswirkungen des gelegentlichen Zwischenspeicherns eines so schlechten Plans als Folge des Parameter-Sniffing, können Sie auch Folgendes in Betracht ziehen:

  • Deaktivieren des Parameter-Sniffing mithilfe des Trace-Flags 4136
  • Verwenden Sie OPTIMIZE FOR (@parameter = value), um einen Plan für einen bekannten repräsentativen Wert zu erstellen
  • Verwenden OPTIMIZE FOR (@parameter UNKNOWN)zur Optimierung anhand der Durchschnittsverteilung
  • Verwenden OPTIMIZE FOR UNKNOWN(wie 4136, jedoch pro Abfrage)
  • Verwenden Sie OPTION (RECOMPILE), um jedes Mal zu kompilieren und den bestimmten Wert zu schnüffeln. Wenn die überwiegende Mehrheit der Laufzeitwerte im Histogramm liegt, kann dies effektiv sein.

Weitere Informationen zum Parameter-Sniffing, zum Einbetten und zu den Optionen zum erneuten Kompilieren finden Sie in meinem Artikel auf SQLperformance.com.

Paul White 9
quelle