Von MSDN :
" Insert Operationen treten auf aufsteigend oder absteigend Schlüsselspalten
Statistik auf- oder Schlüsselspalten absteigend, wie Identität oder Echtzeit - timestamp - Spalten, könnten häufigere Aktualisierungen der Statistiken als die Abfrageoptimierer führt erfordern. Insert - Operationen neue Werte auf- oder absteigenden Spalten anhängen Die Anzahl der hinzugefügten Zeilen ist möglicherweise zu gering, um eine Statistikaktualisierung auszulösen.Wenn die Statistiken nicht aktuell sind und Abfragen aus den zuletzt hinzugefügten Zeilen ausgewählt werden, werden für die aktuellen Statistiken keine Kardinalitätsschätzungen für diese neuen Werte erstellt Dies führt zu ungenauen Schätzungen der Kardinalität und einer langsamen Abfrageleistung.
Beispielsweise enthält eine Abfrage, die aus den letzten Auftragsterminen auswählt, ungenaue Kardinalitätsschätzungen, wenn die Statistiken nicht aktualisiert werden, um Kardinalitätsschätzungen für die letzten Auftragstermine zu enthalten.
Nach Wartungsvorgängen
Nach Durchführung von Wartungsvorgängen, die die Verteilung von Daten ändern, wie z. B. Abschneiden einer Tabelle oder Masseneinfügung eines großen Prozentsatzes der Zeilen, sollten Sie die Statistiken aktualisieren. Dies kann zukünftige Verzögerungen bei der Abfrageverarbeitung vermeiden, während Abfragen auf automatische Statistikaktualisierungen warten. "
Sie können von Zeit zu Zeit "EXEC sp_updatestats" auf Ihrem System verwenden (geplant) oder die Funktion STATS_DATE für alle Objekte verwenden, um zu sehen, wann ihre Statistiken das letzte Mal aktualisiert wurden und ob seitdem zu viel Zeit vergangen ist. Verwenden Sie UPDATE STATISTIKEN für dieses bestimmte Objekt. Meiner Erfahrung nach sind wir auch mit aktivierter automatischer Statistik gezwungen, die Statistiken von Zeit zu Zeit zu aktualisieren, da Einfügevorgänge keine automatische Aktualisierung ausgelöst haben.
So fügen Sie meinen persönlichen Code hinzu (der in einem wöchentlichen Job verwendet wird, der dynamische Anweisungen für die Aktualisierung von Statistiken erstellt):
select distinct
'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
+ case when stats.RowCnt > 50000 then ' with sample 30 percent;'
else
';' end
as UpdateStatement
from (
select
ss.name SchemaName,
so.name TableName,
so.id ObjectId,
st.name AS StatsName,
STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
, si.RowModCtr
, (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
from sys.stats st
join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
join sys.schemas ss on ss.schema_id = so.uid
) stats
where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
and stats.RowCnt > 0
)
Hier bekomme ich alle Objekte, bei denen die Statistiken länger als 3 Monate nicht aktualisiert wurden oder bei denen sich seit der letzten Aktualisierung der Statistiken mehr als 10% der Zeilen geändert haben.
where col=(cast @var...)
) und sein@var
könnte'%'
. Ich habe es erst vor ein oder zwei Wochen geerbt und muss es im Grunde so lange funktionieren lassen, bis es ersetzt wird. Danke für den Link, ich werde es versuchen.