Pisałem
ostatnio o zagadnieniach związanych z indeksami, gdzie m.in. starałem się uzasadnić potrzebę ich okresowej odbudowy. Oczywiście dokonywanie tego ręcznie - czy to poprzez interfejs Management Studio, czy przez polecenie ALTER INDEX .. REBUILD - jest delikatnie mówiąc mało praktyczne. Najczęściej wykorzystuje się do tego celu procedurę SQL, która z odpowiednią częstotliwością wywoływana jest z harmonogramu. Poniżej zamieszczam moją propozycję na tego typu procedurę:
Procedura reindeksacji (skrypt SQL z definicją) -
proc_reindex.sql
Procedura odbuduje wszystkie indeksy w bazie danych o podanej nazwie, jeżeli ich poziom fragmentacji jest większy niż zadany.
Parametry:
@database_name [sysname] - nazwa bazy danych, w której ma odbyć się reindeksacja
@min_fragmentation_level [numeric(5,2)] - minimalny poziom fragmentacji, zakres 0-100.00;
domyślnie: 0 (wszystkie indeksy podlegają odbudowie - niezależnie od poziomu fragmentacji)
Opisywaną procedurę najlepiej utworzyć w bazie master - nie ma konieczności tworzenia jej we wszystkich bazach, w których ma odbywać się reindeksacja (procedura sama "przełączy" sobie kontekst). Zalecane jest uruchamianie procedury na prawach sysadmina (choć możliwe jest także selektywne dobranie odpowiedniego zestawu uprawnień na słabszym użytkowniku).
Przykładowe wywołania:
EXEC master..proc_reindex 'mojabaza'
EXEC master..proc_reindex 'mojabaza', 20
Procedura nie zadziała na SQL Server 2000.