Database
 sql >> Datenbank >  >> RDS >> Database

AKTUALISIERUNGEN zu Statistiken

Die letzten Versionen von SQL Server haben eine Reihe neuer Features sowie Verbesserungen an vorhandener Funktionalität eingeführt. Ein leicht zu übersehender Bereich der Engine sind Statistiken. Schließlich werden Statistiken immer noch auf die gleiche Weise erstellt, sie geben immer noch Aufschluss über die Verteilung von Daten, sie werden immer noch vom Abfrageoptimierer verwendet … was ist anders? Die grundlegende Funktion von Statistiken bleibt gleich – aber wie sie vom Abfrageoptimierer verwendet werden, ändert sich je nach verwendetem Kardinalitätsschätzer. Es gibt auch einige bemerkenswerte Änderungen im Zusammenhang mit der Aktualisierung von Statistiken, und es wurden neue Funktionen zum Anzeigen von Statistikinformationen hinzugefügt. Insgesamt können diese Änderungen in den neuesten Versionen zu einer Abweichung im Verhalten von SQL Server führen, die Sie nicht erwartet haben.

Hinweis:Dieser Beitrag gilt am besten für SQL Server 2012 und höher, aber einige Details für frühere Versionen sind als Referenz (und zum Spaß) enthalten.

SQL-Server 7.0

  • Die Anzahl der Schritte in einem Histogramm ist auf 300 begrenzt. In SQL Server 6.5 und früher hätte ein Histogramm die Anzahl der Schritte, die auf eine 2-KByte-Seite passen könnten, basierend auf der Größe der ersten Spalte im Schlüssel.
  • Die Datenbankoption „Statistiken automatisch aktualisieren“ wird eingeführt; Bisher wurden Statistiken nur manuell aktualisiert.

SQL-Server 2000

  • Die Anzahl der Schritte im Histogramm wird von 300 auf 200 reduziert (technisch gesehen 201, wenn Sie den Schritt für NULL einbeziehen, vorausgesetzt, die erste Spalte im Schlüssel erlaubt NULLen).

SQL-Server 2005

  • Aktualisierungen von Statistiken, die FULLSCAN verwenden, können parallel ausgeführt werden.
  • Die Ablaufverfolgungsflags 2389 und 2390 wurden in SP1 eingeführt, um bei dem Problem mit aufsteigenden Schlüsseln zu helfen, das im Beitrag "Aufsteigende Schlüssel und Statistiken zur automatischen Schnellkorrektur" beschrieben wird. Ein ausführliches Beispiel für dieses Szenario finden Sie in meinem Beitrag Trace Flag 2389 and the new Cardinality Estimator.
  • Die Instanzoption „Statistiken automatisch asynchron aktualisieren“ wird eingeführt. Beachten Sie, dass dazu auch die Option „Statistiken automatisch aktualisieren“ aktiviert sein muss. Wenn Ihnen nicht klar ist, was diese Option bewirkt, lesen Sie die Dokumentation in ALTER DATABASE SET-Optionen. Dies ist eine Einstellung, die Glenn empfiehlt (wie in seinem Beitrag unten erwähnt), aber ich denke, es ist wichtig, sich möglicher Probleme bewusst zu sein, wie in How Automatic Updates to Statistics Can Impact Query Performance beschrieben.

    Hinweis: Es gibt ein Speicherleck im Zusammenhang mit dieser Einstellung in SQL Server 2008 bis SQL Server 2012; Weitere Einzelheiten finden Sie in Glenns Post „Wichtiger Hotfix für SQL Server 2008“.

SQL-Server 2008

  • Gefilterte Statistiken werden eingeführt und diese können separat von einem gefilterten Index erstellt werden. Es gibt einige Einschränkungen bei gefilterten Indizes in Bezug auf den Abfrageoptimierer (siehe Tim Chapmans Post The Pains of Filtered Indexes und Paul Whites Post Optimizer Limitations with Filtered Indexes), und es ist wichtig, das Verhalten des Zählers zu verstehen, der Änderungen verfolgt (und kann somit automatische Updates auslösen). Weitere Einzelheiten finden Sie in Kimberlys Beitrag „Filtered indexes andfiltered stats may be much out-of-date“. Ich habe dies für mehrere große Kunden implementiert, die VLTs und eine schiefe Verteilung über Spalten haben, die häufig in Prädikaten verwendet werden.
  • Zwei neue Katalogansichten, sys.stats und sys.stats_columns, wurden hinzugefügt, um einen einfacheren Einblick in Statistiken und enthaltene Spalten zu bieten. Verwenden Sie diese beiden Ansichten anstelle von sp_helpstats, das veraltet ist und weniger Informationen liefert.

SQL Server 2008R2 SP1

  • Das Ablaufverfolgungsflag 2371 wird zur Verfügung gestellt, das verwendet werden kann, um die Anzahl der Änderungen zu reduzieren, die erforderlich sind, damit automatische Aktualisierungen der Statistiken erfolgen. Zur Erinnerung:Ich bin ein Fan davon, Statistiken regelmäßig durch einen geplanten Job zu aktualisieren und die automatische Aktualisierung aus Sicherheitsgründen aktiviert zu lassen.

SQL Server 2008R2 SP2

  • Die Funktion sys.dm_db_stats_properties ist enthalten, die die gleichen Informationen liefert, die im Header von DBCC SHOW_STATISTICS zu finden sind, sowie eine Änderungsspalte, die verwendet werden könnte, um Änderungen zu verfolgen und programmgesteuert zu bestimmen, ob eine Aktualisierung erforderlich war. Erinnern Sie sich an meine Vorliebe, einen Job zum Aktualisieren von Statistiken zu verwenden? Dieser Job ist mit diesem DMF jetzt viel intelligenter geworden ... jetzt kann ich sehen, wie viele Daten geändert wurden, und Statistiken NUR aktualisieren, wenn sich ein bestimmter Prozentsatz der Daten geändert hat. Glatt.

SQL-Server 2012

  • Das Aktualisieren von Statistiken führt nicht dazu, dass Pläne ungültig werden, WENN sich keine Zeilen geändert haben. Dies ist eine Frage, die viele Leute überrascht, und Kimberly hat einen lustigen Beitrag mit dem Titel „Was hat dazu geführt, dass dieser Plan schrecklich schiefgelaufen ist – sollten Sie Statistiken aktualisieren?

    SQL Server 2012 SP1

    • DBCC SHOW_STATISTICS erfordert nur die SELECT-Berechtigung – zuvor musste ein Benutzer Mitglied von sysadmin oder Mitglied der Datenbankrolle db_owner oder db_ddladmin sein. Dies kann global mit dem Ablaufverfolgungsflag 9485 deaktiviert werden.
    • Enthält sys.dm_db_stats_properties (siehe Hinweis zu 2008R2 SP2 oben)

    SQL Server 2012 SP2

    • Kumulatives Update 1 führt einen Fix im Zusammenhang mit aufsteigenden Schlüsseln ein, die nicht richtig identifiziert werden, selbst wenn die Trace-Flags 2389 und 2390 verwendet werden. Dies erfordert zusätzlich zu CU1 das Ablaufverfolgungsflag 4139, wie in KB 2952101 angegeben.

    SQL-Server 2014

    • Der neue Kardinalitätsschätzer wird eingeführt, implementiert durch Setzen des Datenbankkompatibilitätsmodus auf 120 oder durch Verwenden des Ablaufverfolgungsflags 2312. Wenn Sie noch nichts über das neue CE gelesen haben, empfehle ich, mit der Kardinalitätsschätzungsdokumentation zu beginnen und dann Joe zu lesen Sacks Whitepaper Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator für ausführliche Details.
    • Das Verhalten der Trace-Flags 2389 und 2390 für aufsteigende Schlüssel wird nun über den Datenbank-Kompatibilitätsmodus implementiert. Wenn der Kompatibilitätsmodus Ihrer Datenbanken auf 120 (oder höher in späteren Versionen) festgelegt ist, müssen Sie die Ablaufverfolgungsflags 2389 und 2390 nicht verwenden, damit SQL Server Statistiken mit aufsteigenden Schlüsseln identifiziert.
    • Inkrementelle Statistiken werden für Partitionen eingeführt und können über das neue DMF sys.dm_db_incremental_stats_properties angezeigt werden. Inkrementelle Statistiken bieten eine Möglichkeit, Statistiken für eine Partition zu aktualisieren, ohne sie für die gesamte Tabelle zu aktualisieren. Die zusätzlichen Statistikinformationen aus den inkrementellen Statistiken werden jedoch nicht vom Abfrageoptimierer verwendet, sondern in das Haupthistogramm für die Tabelle gefaltet.
    • CU2 enthält denselben Fix, der oben für SQL Server 2012 SP2 erwähnt wurde, der auch das Ablaufverfolgungsflag 4139 erfordert.

    SQL Server 2014 SP1

    • Trace-Flag 7471 wird auf CU6 zurückportiert, ursprünglich verfügbar in SQL Server 2016, wie unten angegeben.

    SQL-Server 2016

    • Das Ablaufverfolgungsflag 2371 wird nicht mehr benötigt, um den Schwellenwert für automatische Aktualisierungen von Statistiken zu verringern, wenn der Datenbankkompatibilitätsmodus auf 130 festgelegt ist. Siehe Steuern des Verhaltens von Autostat (AUTO_UPDATE_STATISTICS) in SQL Server.
    • Statistikaktualisierungen können parallel ausgeführt werden, wenn SAMPLE verwendet wird, nicht nur FULLSCAN. Dies ist an den Kompatibilitätsmodus gebunden (muss 130 sein), kann aber möglicherweise schnellere Updates bereitstellen und somit Wartungsfenster verkürzen. Aaron Bertrand spricht über diese Verbesserung in seinem Beitrag Eine potenzielle Verbesserung für Statistikaktualisierungen:MAXDOP.
    • Das Ablaufverfolgungsflag 7471 wird in CU1 eingeführt, damit mehrere UPDATE STATISTICS-Befehle gleichzeitig für eine einzelne Tabelle ausgeführt werden können, und Jonathan liefert einige großartige Beispiele dafür, wie dies in seinem Beitrag Improved Support for Parallel Statistics Rebuilds verwendet werden kann.

    SQL Server 2016 SP1

    • Die Abfragehinweisoption ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS wird zusammen mit dem FOR HINT-Argument eingeführt, das dem Trace-Flag 4139 entspricht.
    • Das DMF sys.dm_db_stats_histogram wird in CU2 bereitgestellt, das eine Alternative zur Histogrammausgabe von DBCC SHOW_STATISTICS darstellt. Die Informationen in beiden sind die gleichen, verwenden Sie, was für Sie einfacher ist oder besser zu dem Problem passt, das Sie lösen müssen.
    • Die Option PERSIST_SAMPLE_PERCENT wird in CU4 eingeführt, die verwendet werden kann, um zu erzwingen, dass jedes Mal, wenn eine Statistik aktualisiert wird, die gleiche Abtastrate verwendet wird. Beispiele für dieses Verhalten finden Sie im Beitrag Persistente Statistik-Abtastrate.

    SQL-Server 2017

    • Die Option PERSIST_SAMPLE_PERCENT ist in CU1 verfügbar (weitere Informationen finden Sie im Eintrag 2016 SP1).
    • Die Attribute StatsInfoType und OptimizerStatsUsageType werden dem Abfrageplan hinzugefügt, der Statistiken auflistet, die während der Abfrageoptimierung verwendet werden. Diese ist in CU3 verfügbar und an die CE-Version (120 und höher) gebunden. Das ist ziemlich cool! Ich hatte noch keine Gelegenheit, damit zu spielen, aber um diese Informationen zu erhalten, musste man zuvor undokumentierte Trace-Flags verwenden.
    • CU3 führte auch die MAXDOP-Option für CREATE STATISTICS und UPDATE STATISTICS ein, die verwendet werden können, um den MAXDOP-Wert für die Instanz oder Datenbank zu überschreiben.
    • Eine weitere Ergänzung in CU3:Die Attribute UdfCpuTime und UdfElapsedTime sind im Abfrageplan zu finden, die Ausführungsstatistiken für Skalarwert-UDFs darstellen.

    Zusammenfassung

    Wenn Sie auf eine neuere Version upgraden möchten oder kürzlich ein Upgrade durchgeführt haben, beachten Sie, wie sich diese Änderungen auf Ihre Lösung auswirken. Viele Kunden haben uns nach einem Upgrade von 2005/2008/2008R2 auf 2014 oder 2016 kontaktiert und sich über Leistungsprobleme beschwert. In vielen Fällen wurden vor dem Upgrade keine angemessenen Tests durchgeführt.

    Darauf konzentrieren wir uns wirklich, wenn wir einem Kunden beim Upgrade helfen. Abgesehen von den Schritten zum Verschieben einer Produktionsinstanz von einer Version auf eine andere mit geringer Ausfallzeit möchten wir sicherstellen, dass der Tag nach dem Upgrade für DBAs und Entwickler langweilig wird.

    Wir testen nicht einfach den Upgrade-Prozess, wir testen, wie das System nach dem Upgrade aussieht. Werden die gleichen Ablaufverfolgungsflags aus der alten Umgebung in der neuen Umgebung benötigt? Welche Datenbankeinstellungen müssen angepasst werden? Ändert sich die Abfrageleistung – zum Guten oder zum Schlechten? Wenn Sie die Antworten auf diese Fragen nicht kennen, bevor Sie die Produktion aufrüsten, dann bereiten Sie sich auf einen oder mehrere Tage Brandbekämpfung, Notrufe 1, Mahlzeiten am Schreibtisch, zu wenig Schlaf und wer weiß was noch vor .

    Nehmen Sie sich vorab Zeit, um die Auswirkungen der oben aufgeführten neuen Funktionen und Funktionsänderungen zu verstehen, planen Sie das Upgrade und testen Sie so viel wie möglich.