W ubiegłym tygodniu robiłem kurs MS10775A i pojawiło się jedno pytanie, na które trener nie mógł odpowiedzieć w wiarygodny sposób:
Czy ponowne indeksowanie aktualizuje statystyki?
Znaleźliśmy dyskusje online, w których dowodzi, że tak jest, a nie tak.
sql-server
index
sql-server-2012
index-tuning
statistics
Thor Erik
źródło
źródło
REINDEX
nie aktualizuje statystyk kolumn jako efekt uboczny przebudowy indeksu - nie trzeba aktualizować statystyk. Dane w tabeli się nie zmieniają. To te same dane, tylko: a) przeniósł swoją lokalizację na obracający się talerz (gdy strona jest reorganizowana) lub b) siedzi na innej stronie (w przypadku przebudowy). Więc: re-index robi aktualizacji (troche) statystyki: nie ma potrzeby, aby to zrobić.Odpowiedzi:
Podczas aktualizowania statystyk możesz wziąć pod uwagę następujące kwestie (skopiowane z Przebudowy Indeksów vs. Aktualizacji Statystyki (Benjamin Nevarez)
Domyślnie
UPDATE STATISTICS
instrukcja używa tylko próbki rekordów tabeli. UżywanieUPDATE STATISTICS WITH FULLSCAN
spowoduje przeskanowanie całej tabeli.Domyślnie
UPDATE STATISTICS
instrukcja aktualizuje statystyki indeksu i kolumny. Użycie tejCOLUMNS
opcji spowoduje aktualizację tylko statystyk kolumn. Użycie tejINDEX
opcji spowoduje aktualizację tylko statystyk indeksu.Odbudowanie indeksu , na przykład za pomocą,
ALTER INDEX … REBUILD
spowoduje również zaktualizowanie statystyki indeksu za pomocą równoważnika użycia,WITH FULLSCAN
chyba że tabela zostanie podzielona na partycje, w którym to przypadku statystyki są tylko próbkowane (dotyczy SQL Server 2012 i nowszych).Statystyki utworzone ręcznie przy użyciu
CREATE STATISTICS
nie są aktualizowane przez żadnąALTER INDEX ... REBUILD
operację, w tymALTER TABLE ... REBUILD
.ALTER TABLE ... REBUILD
aktualizuje statystyki dla indeksu klastrowanego, jeśli jest on zdefiniowany w odbudowywanej tabeli.Reorganizacja indeksu , na przykład za pomocą
ALTER INDEX … REORGANIZE
, nie aktualizuje żadnych statystyk.Krótka odpowiedź brzmi: musisz użyć,
UPDATE STATISTICS
aby zaktualizować statystyki kolumn i że przebudowa indeksu zaktualizuje tylko statystyki indeksu. Możesz wymusić aktualizację wszystkich statystyk w tabeli, w tym statystyk indeksów i statystyk utworzonych ręcznie, przy użyciuUPDATE STATISTICS (tablename) WITH FULLSCAN;
składni.Poniższy kod ilustruje powyższe reguły:
Najpierw utworzymy tabelę z kilkoma kolumnami i indeksem klastrowym:
To zapytanie pokazuje datę ostatniej aktualizacji każdego obiektu statystyki:
Wyniki pokazują, że nie nastąpiły jeszcze żadne aktualizacje, co jest poprawne, ponieważ właśnie utworzyliśmy tabelę:
Przebudujmy całą tabelę i zobaczmy, czy to aktualizuje statystyki:
Wyniki pokazują, że tylko statystyki indeksu klastrowego zostały zaktualizowane.
Następnie wykonujemy dyskretną
UPDATE STATS
operację:Jak widać, właśnie zaktualizowaliśmy statystyki w
d
kolumnie:Teraz zaktualizujemy statystyki dla całej tabeli:
Jak widać, jedynym sposobem na upewnienie się, że wszystkie statystyki są aktualizowane, jest albo aktualizacja każdej z nich ręcznie, albo aktualizacja całej tabeli
UPDATE STATISTICS (table);
.źródło
ALTER INDEX ... REBUILD
lubUPDATE STATISTICS
instrukcji. Jeśli sama tabela zostanie przebudowana, aktualizowane są tylko statystyki indeksu klastrowego. FYI, klucz podstawowy i indeks klastrowany niekoniecznie są obsługiwane przez ten sam obiekt indeksu.Na stronie Microsoft SQL Server Docs dla statystyki stanów :
źródło