2009-02-24 8 views
12

Czy wszystkie wersje serwera SQL odbudowują indeksy automatycznie lub mają domyślne kryteria przebudowy? Rozumiem, że statystyki są przebudowywane automatycznie, ale nie wiem, czy indeksy też się sprawdzają.Czy wszystkie wersje serwera SQL odbudowują indeksy automatycznie lub mają domyślne kryteria przebudowy?

+0

Nie sądzę Statystyki są odbudowane automatycznie - są odbudowane, gdy indeks jest przebudowywany lub przez konkretnego polecenia. Kreator konserwacji umożliwia skonfigurowanie rozsądnego programu obsługi bazy danych "starter", ale w przypadku większych/zajętych baz danych konieczne może być zbudowanie czegoś bardziej wyrafinowanego. – Kristen

+0

Zobacz moją odpowiedź, aby uzyskać szczegółowe informacje na temat działania statystyk w SQL Server. –

Odpowiedz

9

Przebudowa indeksów nie jest obsługiwana automatycznie w żadnej wersji programu Microsoft SQL Server - powodem jest to, że przebudowywanie indeksów może potencjalnie być bardzo kosztownymi operacjami, a więc wymaga starannego planowania i planowania.

W wielu środowiskach specjalne skrypty zostaną zapisane do obsługi to na przykład:

http://weblogs.sqlteam.com/tarad/archive/2008/09/03/Defragmenting-Indexes-in-SQL-Server-2005.aspx

Należy zauważyć, że podczas gdy SQL może automatycznie aktualizować statystyki dla Ciebie w wielu przypadkach istnieje przyrost wydajności, które można uzyskać przez zarządzanie nimi również bardziej ostrożnie.

+0

Widzę, że twoja odpowiedź pochodzi z 2009 roku, czy to nadal obowiązuje dla nowszych wersji serwera sql? –

+0

AFAIK jest nadal ważny, chociaż mogą istnieć lepsze opcje, które pomogą Ci ustawić ten rodzaj prac konserwacyjnych. Być może sprawdź na http://dba.stackexchange.com? – Chris

0

To musi być zaplanowane i zaaranżowane samodzielnie.

Podczas sortowania zależy to od wielkości tabel i okna konserwacji.

Statystyki są również odbudowywane automatycznie, gdy indeksy są przebudowywane, ale można je zaplanować oddzielnie.

Dla szybkiej i taniej, zakładając piękny okno długo konserwacji i nie jest zbyt duży (do września kilka 100 GBS), wystarczy zaplanować następująco:

EXEC sp_msforeachtable 'SET QUOTED_IDENTIFIER ON ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)' 

Edit: tylko dla> SQL 2005 to SQL

0

Jak zauważyli @Chris, indeksy nie są automatycznie odbudowywane w żadnej wersji programu SQL Server. Odpowiednia konserwacja indeksu często nie jest dostępna w witrynach bez dedykowanej roli DBA, a często, gdy bazy danych są po prostu przenoszone z rozwoju do produkcji (wraz z konserwacją dziennika transakcji).

Program SQL Server 2005+ może przeprowadzać reorganizacje indeksu online i pełne odbudowy w trybie offline.

7

Jak już wspomniano, Twoje indeksy nie są automatycznie odbudowywane. Jest to dość duży problem w SQL Server, ponieważ indeksy będą się z czasem rozpadać. Twoje indeksy mogą być 95% plus pofragmentowane, co źle wpływa na wydajność zapytań.

Oto proste zapytanie do sprawdzenia fragmentacji na istniejących indeksów:

DECLARE @DBNAME VARCHAR(130); 
SET @DBNAME = 'MYDBNAME'; 

DECLARE @DBID INT; 
SET @DBID = DB_ID(@DBNAME); 

SELECT 
OBJECT_ID AS objectID 
, index_id AS indexID 
, avg_fragmentation_in_percent AS fragmentation 
, page_count 
INTO #indexDefragList 
FROM 
sys.dm_db_index_physical_stats 
(@DBID, NULL, NULL , NULL, N'Limited') 
WHERE 
index_id > 0 
OPTION (MaxDop 1); 

SELECT 
i.[name] as indexname, 
d.fragmentation, 
d.page_count 
FROM 
#indexDefragList d 
INNER JOIN sys.indexes i 
ON d.objectid = i.object_id 
ORDER BY 
d.fragmentation DESC 

DROP TABLE #indexDefragList 

ta zwróci listę wszystkich indeksów w bieżącej DB z ich fragmentacji%.

Możesz łatwo zbudować skrypt, aby automatycznie go przebudować lub zreorganizować. Istnieje great article from SQLFool on this, w tym kompletny wstępnie przygotowany skrypt.

+0

dzięki za skrypt. Ale musiałem zastąpić OBJECT_ID do object_id i d.objectid na d.objectID. Przypuszczam, że dzieje się tak z powodu wielkości liter małych liter w zależności od mojego obecnego kodowania. – Fer

1

Aby rozwinąć na co Chris powiedział:

W odniesieniu do statystyk, kolumny nieobjęte indeksu nie będzie ich statystyki aktualizowane przez odbudowy wszystkich indeksów. Mogą być okresowo aktualizowane przez SQL Server, jednak może być konieczne wykonanie tego samodzielnie za pomocą instrukcji UPDATE STATISTICS.

SQL Server 2005 określa, czy automatycznie aktualizować statystyki na podstawie zmian liczników modyfikacji kolumn (producentów danych).

A Statystyki obiekt uważany jest za nieaktualne w następujących przypadkach:

1. Tabela rozmiarów wzrosła z 0> 0 rzędach.

2. Liczba wierszy w tabeli, w której zebrano statystyki, wynosiła 500 lub mniej, a od tego czasu zmieniono rozmiar kolumny wiodącej obiektu statystycznego o ponad 500.

3. Tabela zebrała ponad 500 wierszy, gdy statystyki zostały zebrane, a kolmodytor pierwszej kolumny obiektu statystyki zmienił się o więcej niż 500 + 20% liczby wierszy w tabeli, gdy statystyki zostały zebrane

może się okazać następujące odniesienie dotyczące statystyk użytkowania:

http://blogs.technet.com/rob/archive/2008/05/16/sql-server-statistics.aspx

nadzieję, że pomoże, ale nie krępuj się stwarzać dalszych zapytań.

Cheers John

Powiązane problemy