2010-11-25 3 views
1

In dem System, an dem ich arbeite, sehen wir, dass ein bestimmtes SELECT einen Clustered-Index-Scan verwendet, anstatt den Index zu verwenden, der für dieses SELECT erstellt wurde. Ich habe mir die Statistiken für den Index angesehen und festgestellt, dass sie 26 Tage alt waren. Ich habe die Statistiken mit FULLSCAN aktualisiert. Jetzt benutzt der SELECT den Index.AUTO_UPDATE_STATISTICS kann Statistiken für bestimmte Indizes nicht aktualisieren. Warum?

AUTO_UPDATE_STATISTICS wurde in dieser Datenbank die ganze Zeit aktiviert. Warum wurde die Statistik nicht aktualisiert?

Mit Blick auf die STATS_DATE() -Ausgabe (Abfrage unten):

SELECT 
    object_name = Object_Name(ind.object_id), 
    IndexName = ind.name, 
    StatisticsDate = STATS_DATE(ind.object_id, ind.index_id), 
    ind.type 
    FROM SYS.INDEXES ind 
    order by STATS_DATE(ind.object_id, ind.index_id) desc 

Ich sehe, dass viele Indizes aktualisiert wurden. Einige große Tabellen, die täglich Datenupdates enthalten, haben seit Wochen keine aktualisierten Statistiken mehr.

Wie entscheidet MSSQL 2005, wann Statistiken aktualisiert werden sollen, wenn AUTO_UPDATE_STATISTICS aktiviert ist? Die Dokumentation lautet:

Eine Statistikaktualisierung wird immer dann ausgelöst, wenn die in einem Abfrageausführungsplan verwendeten Statistiken einen Test für aktuelle Statistiken nicht bestehen. . . Fast immer werden statistische Informationen aktualisiert, wenn sich ungefähr 20 Prozent der Datenzeilen geändert haben.

Kann dies vertraut werden? Vielleicht sind diese Tabellen so groß, dass der "Statistic Statistics Test" auch dann noch besteht, wenn täglich Datensätze eingefügt werden.

+0

Ich wette, Sie wünschen Sie wurden mit SQL2K8, so dass Sie diesen Index auf einen gefilterten Index ändern könnte. –

Antwort

0

Hier ist ein Link zu den Algorithmus Details in einem Microsoft

http://technet.microsoft.com/sv-se/library/cc966419(en-us).aspx#XSLTsection130121120120

Und das quoted von Erland Sommarskog White Paper:

Wenn Sie eine leere Tabelle, AutoStats ersten Tritten in nach 500 Reihen. Von dort setzt autostats in , wenn 20% der Zeilen geändert worden sind. Dies ist ein Maß von einigen rowmodctr.

Dies hat den Effekt, dass große Tische mit einer monoton wachsenden Schlüssel wo Abfragen gegen den Stamm haben ihre Statistiken aktualisiert geht viel zu selten.

Die kleinen Tische, an denen alle Zeilen häufig aktualisiert werden, oder wo oder Zeilen hinzugefügt und gelöscht werden, haben ihre Statistiken sehr häufig aktualisiert, bei dem es sich Ursache Neuübersetzung Fragen.

+0

Mein Problem ist das Gegenteil. In einer Tabelle mit 11 Millionen Datensätzen hat eine Spalte einen Nonclustered-Index.Diese Spalte ist int und wird in allen Datensätzen mit 0 aufgefüllt. Unsere Anwendung begann, eine Handvoll Datensätze mit Werten ungleich Null einzufügen. Die Indexstatistik wurde nicht automatisch aktualisiert. Daher entschied sich der Optimierer für die Verwendung eines Clustered-Index-Scans. – Jacob

Verwandte Themen