Es wird empfohlen, STATISTICS_NORECOMPUTE zu verwenden

9

Ich habe mich kürzlich mit der Pflege einer Reihe von Datenbanken mit einigen interessanten Indexproblemen befasst. Einer der Gründe, die mich am meisten erschweren, sind die Unterschiede in den Indizes zwischen Entwicklungs-, Test-, Modell- und Produktionsmaschinen. Da die Unterschiede das Synchronisieren von Abfragen ziemlich schwierig machen, ist dies eines meiner ersten Projekte.

Beim Vergleich der Test- und Modellumgebungen habe ich festgestellt, dass die meisten Indizes in der Modellumgebung auf STATISTICS_NORECOMPUTEeingestellt sind, ONwährend dies bei den Testindizes nicht der Fall ist . In allen Umgebungen gibt es einen nächtlichen Job, der die Statistiken aller Datenbanken aktualisiert.

Ich habe mich noch nie damit befasst. STATISTICS_NORECOMPUTEHier sind meine Fragen. Gibt es Best Practices für den Umgang mit dieser Einstellung? Wenn ich am Ende des Tages Statistikaktualisierungen durchführe, ist es am besten, STATISTICS_NORECOMPUTEalle Umgebungen in allen Indizes einzuschalten? Oder gibt es einen guten Grund, dies nicht zu tun?

EDIT: Ich habe hier einen von Kimberly Tripps Blogs zu diesem Thema gefunden , der darauf hindeutet, dass er STATISTICS_NORECOMPUTEbestenfalls sparsam verwendet werden sollte. Aber ich bin immer noch besorgt darüber, es global auszuschalten. Hat jemand dies versucht und was haben sie erlebt?

Kenneth Fisher
quelle
Sie müssten diese Anwendung sehen, um es zu glauben. Einige Tabellen haben Dutzende Indizes, andere keine, einige haben mehrere Duplikate. Es ist ein echtes Durcheinander. Irgendwelche allgemeinen Richtlinien? Kann ich irgendwo lesen?
Kenneth Fisher
1
Ein guter Fall wäre die Verwendung von STATISTICS_NORECOMPUTE = ON und FILLFACTOR = 100 für schreibgeschützte Nachschlagetabellen, die nur von Datenbankadministratoren mithilfe eines Skripts geändert werden, das nach den Änderungen einen INDEX REBUILD mit FULLSCAN ausführt. Dann ist die Tabelle in optimaler Form mit optimalen Statistiken und ohne weitere Änderungen. Es gibt keinen Grund, überhaupt eine Neuberechnung von Statistiken in Betracht zu ziehen oder Platz zu lassen, um die Seitenteilung bei zukünftigen Änderungen zu verringern.
Anti-Schwachkennwörter

Antworten:

4

Es ist wirklich eine situative Sache, die Sie pro Tabelle oder pro Index betrachten möchten, und Sie müssen wirklich herausfinden, was in der Produktion ist, bevor Sie Maßnahmen ergreifen. Verwenden Sie im Zweifelsfall die Produktion auch in anderen Umgebungen, auch wenn dies eine Reihe verrückter Einstellungen bedeutet. Man kann einfach kein gutes Gefühl dafür bekommen, wie sich die Produktion verhält, wenn die Dinge in Test oder Entwicklung anders sind.

Wie auch immer, die allgemeine Empfehlung, die Statistiken für die automatische Aktualisierung STATISTICS_NORECOMPUTE = OFFaktiviert zu lassen ( dies ist die Standardeinstellung), gilt aus Sicherheitsgründen. Wenn diese Option deaktiviert ist und die Statistiken nicht manuell aktualisiert werden, kann dies zu wirklich schrecklichen Ausführungsplänen führen, die sich nie ändern nachdem sie zum ersten Mal erstellt wurden (und später aus anderen Gründen nicht ungültig werden).

Sie sagten, dass die Statistiken für die automatische Aktualisierung für die meisten Indizes deaktiviert sind (ich glaube, ich habe das ursprünglich wie alle falsch verstanden , nicht die meisten ). Ist diese Einstellung für die Indizes mit noch aktivierten Statistiken für die automatische Aktualisierung angesichts der Aktivität in diesen Tabellen sinnvoll? Ich würde erwarten, dass dies Tabellen mit höherer Aktivität sind. Es ist möglich, dass viel Arbeit darauf verwendet wurde, dies herauszufinden, und es kann sich lohnen, diese Einstellungen beizubehalten (oder stark zu berücksichtigen). Notieren Sie sich zumindest, um welche Statistiken es sich handelt, da diese Informationen später nützlich sein können.

Wenn ich mehr darüber nachdenke, werde ich sagen, dass die aktuelle Strategie Sinn macht. Ist es besser, als die Statistiken für die automatische Aktualisierung für alles aktiviert zu lassen? Es scheint, dass jemand dies so gedacht hat, dass es sich gelohnt hat, einen einfachen SQL Agent-Job zu haben.

Wenn die Idee bestand, neue Statistiken verfügbar zu haben, ohne Abfragen zu blockieren (wie diese ), können Sie die automatische Aktualisierung für alles wieder aktivieren und dann auch aktivieren AUTO_UPDATE_STATISTICS_ASYNC. Ändern Sie dann wahrscheinlich den Jobplan so, dass er einmal pro Woche statt täglich ausgeführt wird, da die Statistiken weiterhin WITH FULLSCANregelmäßig aktualisiert werden sollen.

Ich könnte es jedoch einfach belassen, da Sie wahrscheinlich größere Fische zum Braten haben, wenn die Indizes selbst zwischen den Umgebungen unterschiedlich sind und die Neuerstellungen der Statistiken nicht zu schmerzhaft sind. Was jetzt da ist, macht Sinn; Sie müssen nur die Dinge in allen Umgebungen konsistent machen. Es ist wahrscheinlich geringfügig besser als die einfacheren Einstellungen, die ich vorgeschlagen habe, auf Kosten von mehr Arbeit. Aber finden Sie heraus, was in der Produktion ist, nutzen Sie dies und gehen Sie zu wichtigeren Dingen über. Wiederholen Sie diesen Vorgang, wenn Sie die Leistung genauer einstellen müssen. Die besten Statistiken der Welt speichern keine Abfrage, bei der ein kritischer Index fehlt.

Jon Seigel
quelle
oops ... ich dachte, ich hätte diesen Kommentar nicht abgegeben.
Swasheck