Aufgrund Ihrer Frage kann ich mir vier mögliche Probleme mit Statistiken vorstellen, die die aufgetretenen Probleme verursachen könnten.
1. Statistiken werden nicht oft genug automatisch aktualisiert.
In SQL Server 2012 werden Statistiken erst aktualisiert, nachdem sich 20% oder mehr der Zeilen in der Tabelle geändert haben. Das bedeutet, dass Sie für eine Milliarde Zeilentabelle 200 Millionen Zeilen ändern müssen, bevor eine Statistikaktualisierung erfolgt. Wenn die Tabelle größer wird, werden Ihre Statistikaktualisierungen seltener, sodass SQL Server jahrelang ohne Aktualisierung der Statistiken für große Tabellen arbeiten kann.
TF 2371 ändert den Schwellenwert, sodass Statistikaktualisierungen häufiger auftreten. In SQL Server 2016 wurde diese Änderung zu meiner Standardeinstellung gemacht.
2. Abfragen in Ihrer Workload sind anfällig für das Problem mit aufsteigenden Schlüsseln .
Stellen Sie sich eine Tabelle vor, in die täglich neue Daten geladen werden, und Abfragen, die am letzten Datentag gefiltert werden. Sofern die Statistikaktualisierung nicht unmittelbar nach dem Laden der Daten aktualisiert wird, sind die neuen Daten in keinem der Statistikhistogramme vorhanden. Dies kann aufgrund geringer Kardinalitätsschätzungen zu einer sehr schlechten Abfrageleistung führen.
Das neue CE in SQL Server 2014 verbessert diesen Bereich. Wenn Sie nach Daten außerhalb des Histogrammbereichs fragen, kann dies zu einer optimistischeren Vermutung führen und davon ausgehen, dass die Tabelle Daten enthält, nicht jedoch das Histogramm. In SQL Server 2012 können Sie dieses Problem beheben, indem Sie Statistiken häufiger aktualisieren oder TF 4139 aktivieren . TF 4139 funktioniert nur für Spalten mit einem Index. SQL Server führt möglicherweise eine sehr schnelle Abfrage für den Index aus, um den höchsten oder niedrigsten Wert zu erhalten, und ändert vorübergehend das Histogramm des relevanten Statistikobjekts. Dies kann zu viel besseren Plänen für einige Abfragen führen.
3. Ihre Abfragen warten auf Statistikaktualisierungen.
Wenn eine Abfrage eine veraltete Statistikaktualisierung lädt, wird dieses Statistikobjekt standardmäßig aktualisiert, bevor ein Abfrageplan erstellt wird. Unter SQL Server 2012 wird die Aktualisierung der Stichprobenstatistik mit ausgeführt MAXDOP 1
. Wenn der Vorgang gegen eine große Tabelle gestartet wird, tritt möglicherweise eine Zeitüberschreitung auf, während auf die Aktualisierung der Statistik gewartet wird. Nachdem Sie die Statistiken für die Tabellen aktualisiert haben, ist die Abfrage besser, da sie nicht mehr auf die Aktualisierung der Statistiken warten muss.
Wenn Sie auf dieses Problem stoßen, kann dies durch eine proaktivere Statistikpflege mit der NORECOMPUTE
Option behoben werden. Alternativ können Sie versuchen, die Statistikaktualisierung durch ein Upgrade auf SQL Server 2016 zu beschleunigen. Unter SQL Server 2016 können Stichprobenstatistikaktualisierungen parallel ausgeführt werden.
Eine andere Option ist das Aktivieren der AUTO_UPDATE_STATISTICS_ASYNC
Option. Wenn ein Abfrageplan auf ein veraltetes Statistikobjekt stößt, wird das Statistikobjekt in die Warteschlange gestellt, das von einem Hintergrundjob aktualisiert werden soll. Das klingt vielleicht schlecht und ist es auch. Die Abfrage wird möglicherweise mit veralteten Statistiken ausgeführt. Dies ist die Art von Funktion, die Sie aktivieren möchten, wenn Sie keine bessere Wahl haben, z. B. wenn Sie mit großen Systemen arbeiten, bei denen automatische Statistikaktualisierungen zu teuer sind oder die Planform nicht ausreichend unterstützen. Jack Li hat hier über einen Kunden gebloggt, dem bei dieser Option geholfen wurde .
4. Ihre Arbeitslast würde von manuellen Statistikaktualisierungen mit einer höheren Abtastrate als der automatischen Abtastrate profitieren.
Einige Abfragen und Workloads benötigen mehr als die standardmäßig erfasste Statistikrate, um eine akzeptable Leistung zu erzielen. In einer großen Datenbank kann dies schwierig sein, in späteren Versionen von SQL Server gibt es jedoch einige Tricks und Verbesserungen, die hilfreich sind.
Wenn Sie Ihre Daten und Ihre Arbeitslast sehr gut kennen, können Sie möglicherweise automatische Statistikaktualisierungen deaktivieren. Sie können Statistiken sammeln, die Sie benötigen, FULLSCAN
und diese gegebenenfalls aktualisieren. Dieser Ansatz erfordert viel Arbeit und viel Aufmerksamkeit für den Server.
Wenn Sie über einen vorhandenen Wartungsprozess verfügen, der Indizes neu erstellt (die Weisheit darüber wird diskutiert ), beachten Sie, dass durch die Neuerstellung von Indizes Statistiken automatisch aktualisiert werden. FULLSCAN
Sie können dies also möglicherweise nutzen, wenn Sie eine Wartungslösung zum Aktualisieren von Statistiken erstellen.
Beachten Sie, dass das Sammeln von Stichprobenstatistiken möglicherweise nicht schneller ist als die Vollscanstatistik, insbesondere wenn die Histogrammspalte indiziert ist. SQL Server kann parallel Aktualisierungen der Fullscan-Statistik durchführen. Es kann auch eine Sortierung vermeiden, wenn ein Vollscan einer indizierten Spalte durchgeführt wird, die Sortierung wird jedoch nicht vermieden, wenn die Spalte abgetastet wird. Bei ausreichend großen Tabellen können Statistikaktualisierungen für nicht indizierte Spalten fehlschlagen, wenn sie die temporäre Datenbank füllen.
In SQL Server 2014 wurden inkrementelle Statistiken eingeführt . Angenommen, Sie haben eine partitionierte Tabelle und viele Daten werden in nur einer Partition geändert. Zuvor mussten Sie zum Aktualisieren der Statistiken in der Tabelle alle Partitionen überprüfen. Mit dieser neuen Funktion können Sie einfach neue Statistiken über die geänderte Partition erfassen. SQL Server kann die Statistiken von den Partitionen in ein Objekt auf Tabellenebene zusammenfassen.
Wenn Sie kein Upgrade durchführen können, können Sie einige Tabellen in partitionierte Ansichten konvertieren . Jede Tabelle in der Ansicht erhält ihre eigenen Statistikobjekte. Wenn Sie also Daten nach Datum laden, müssen Sie möglicherweise nur die Statistiken der neuesten Tabelle in der Ansicht anstelle aller Tabellen der Ansicht aktualisieren.
Wie bereits erwähnt, kann SQL Server 2016 die Stichprobenstatistik parallel aktualisieren :
Ab SQL Server 2016 erfolgt die Datenerfassung zum Erstellen von Statistiken parallel, wenn die Kompatibilitätsstufe 130 verwendet wird, um die Leistung der Statistiksammlung zu verbessern. Das Abfrageoptimierungsprogramm verwendet parallele Beispielstatistiken, wenn eine Tabellengröße einen bestimmten Schwellenwert überschreitet.