Z MSDN :
„ Operacje wstawiania występują w kolumnach kluczy
rosnących lub malejących Statystyki dotyczące kolumn kluczy rosnących lub malejących, takich jak TOŻSAMOŚĆ lub kolumny znaczników czasu w czasie rzeczywistym, mogą wymagać częstszych aktualizacji statystyk niż w przypadku optymalizatora zapytań. Operacje wstawiania dodają nowe wartości do kolumn rosnących lub malejących Liczba dodanych wierszy może być zbyt mała, aby uruchomić aktualizację statystyk. Jeśli statystyki nie są aktualne, a zapytania wybierają spośród ostatnio dodanych wierszy, bieżące statystyki nie będą miały oszacowań liczności dla tych nowych wartości. skutkują niedokładnymi oszacowaniami liczności i powolną wydajnością zapytań.
Na przykład zapytanie, które wybiera spośród najnowszych dat zamówienia sprzedaży, będzie miało niedokładne oszacowania liczności, jeśli statystyki nie zostaną zaktualizowane w celu uwzględnienia oszacowań liczności dla ostatnich dat zamówienia sprzedaży.
Po czynnościach konserwacyjnych
Należy rozważyć aktualizację statystyk po przeprowadzeniu procedur konserwacji, które zmieniają rozkład danych, takich jak obcięcie tabeli lub wykonanie masowego wstawiania dużej części wierszy. Dzięki temu można uniknąć przyszłych opóźnień w przetwarzaniu zapytań, gdy zapytania będą czekać na automatyczne aktualizacje statystyk ”.
Możesz od czasu do czasu używać „EXEC sp_updatestats” w systemie (zaplanowane jakiś czas) lub użyć funkcji STATS_DATE na wszystkich obiektach i zobaczyć, kiedy ich statystyki były ostatnio aktualizowane, a jeśli od tego czasu było za dużo, użyj UPDATE STATYSTYKA dla tego konkretnego obiektu. Z mojego doświadczenia wynika, że nawet przy włączonej automatycznej statystyce wciąż jesteśmy zmuszeni aktualizować statystyki od czasu do czasu, z powodu operacji wstawiania, które nie uruchomiły automatycznej aktualizacji.
Aby dodać mój kod osobisty (używany w cotygodniowym zadaniu, które tworzy dynamiczne instrukcje aktualizacji statystyk):
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
)
Tutaj otrzymuję wszystkie obiekty, w których statystyki nie były aktualizowane przez ponad 3 miesiące lub od ostatniej aktualizacji statystyk zmieniło się ponad 10% wierszy.
where col=(cast @var...)
) I@var
może być'%'
. Właśnie odziedziczyłem go tydzień lub dwa lata temu i muszę działać tak długo, aż zostanie zastąpiony. Dzięki za link, dam mu wir.