Istnieje kilka metod odbudowy wszystkich indeksów wszystkich tabel w SQL Server, między innymi:
- Korzystanie z planów konserwacji SQL Server.
- Korzystanie ze skryptu T-SQL w oparciu o procent fragmentacji.
- Za pomocą polecenia ALTER INDEX.
W tym artykule omówimy te metody i zilustrujemy je praktycznymi przykładami.
1. Plan konserwacji indeksu odbudowy serwera SQL
Pierwszą opcją do przejrzenia jest przebudowanie indeksów z planami konserwacji bazy danych. Plany konserwacji są dostępne w folderze zarządzania SQL Server Management Studio.
Aby utworzyć plan konserwacji bazy danych SQL, uruchom SQL Server Management Studio > rozwiń instancję bazy danych > Zarządzanie > kliknij prawym przyciskiem myszy plan konserwacji > Nowy plan konserwacji .
Podaj nazwę planu konserwacji. Następnie przeciągnij i upuść Odbuduj zadanie indeksowania do projektanta planu konserwacji. Zmień nazwę zadania na Konserwacja indeksu .
Następnym krokiem jest konfiguracja planu konserwacji. Kliknij go dwukrotnie i skonfiguruj opcje Zadania odbudowania indeksu w następujący sposób:
- Wybierz AdventureWorks2017 bazy danych z menu rozwijanego Bazy danych.
- Aby odbudować indeksy wszystkich tabel, wybierz Tabele i widoki z Obiektu rozwijane pole.
- Sprawdź Sortuj wyniki w tempdb .
- MAXDOP – zestaw 2 (dwa).
- W naszym przypadku odbudujemy indeksy tylko wtedy, gdy Fragmentacja wartość jest wyższa niż 20%. Dlatego ustaw 20 w odpowiednim polu.
- Kliknij OK aby zapisać konfigurację indeksu i zamknąć Zadanie odbudowy indeksu okno.
Teraz skonfigurujmy harmonogram.
Kliknij kalendarz ikona na górze projektanta planu konserwacji:
Nowy harmonogram pracy otworzy się okno. Skonfigurujmy następujące ustawienia:
- Wykonuj pracę każdego dnia. W typie harmonogramu menu, wybieramy Cykliczne . Następnie w Częstotliwości sekcji, wybieramy Występuje > Codziennie .
- Powtarza się co > 1 (dzień).
- Częstotliwość dzienna > Występuje raz o > podaj dokładny czas. W naszym przypadku jest godzina 1:00.
- Kliknij OK .
Następnie zapisz plan konserwacji.
Utworzone plany konserwacji są dostępne w Planie konserwacji informator. Aby wyświetlić harmonogram powiązany z konkretnym planem konserwacji, sprawdź Praca katalog w agencie serwera SQL .
Aby przetestować zadanie, kliknij prawym przyciskiem myszy jego nazwę w Planach konserwacji katalogu i wybierz Wykonaj z menu:
Rozpoczyna się egzekucja. Po pomyślnym zakończeniu zobaczysz następujące okno dialogowe:
Była to powszechna metoda odbudowy indeksów za pomocą planów konserwacji. Przejdźmy teraz do następnej metody – przy użyciu skryptów T-SQL.
2. Odbudowa ALTER INDEX serwera SQL
Do odbudowania wszystkich indeksów tabeli można użyć polecenia ALTER INDEX. Składnia jest następująca:
ALTER INDEX ALL ON [table_name] REBUILD
Uwaga:nazwa_tabeli parametr określa nazwę tabeli, w której chcemy przebudować wszystkie indeksy w SQL Server.
Na przykład chcemy odbudować wszystkie indeksy [Zasoby ludzkie].[Pracownik] . Zapytanie powinno wyglądać następująco:
use AdventureWorks2017
go
ALTER INDEX ALL ON [HumanResources].[Employee] REBUILD
Go
3. Skrypt SQL Server do odbudowy wszystkich indeksów dla wszystkich tabel na podstawie fragmentacji
Utrzymanie indeksu wymaga dużej ilości zasobów. Poza tym blokuje tabelę, w której odbudowuje indeks. Aby uniknąć takich komplikacji, musimy odbudować indeks, w którym fragmentacja indeksu SQL Server jest wyższa niż 40%.
Aby zilustrować przypadek, stworzyłem skrypt T-SQL, który odbudowuje indeksy o stopniu fragmentacji powyżej 30%. Przyjrzyjmy się jego częściom i funkcjom.
Zmienne i deklaracja tabeli tymczasowej
Najpierw musimy stworzyć tymczasowe tabele i zmienne:
- @IndexFregQuery – przechowuje dynamiczne zapytanie używane do wypełniania pofragmentowanych indeksów.
- @IndexRebuildQuery – przechowuje zapytanie ALTER INDEX.
- @IndexName – nazwa indeksu, który chcemy odbudować
- @TableName – nazwa tabeli, w której chcemy przebudować indeks.
- @SchemaName – nazwa schematu, w którym chcemy przebudować indeks.
- #Fregmentedindex – 3-kolumnowa tabela który przechowuje nazwę indeksu, nazwę tabeli i nazwę schematu.
Poniższy kod deklaruje nasze zmienne i tabelę tymczasową:
declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))
Pobierz listę pofragmentowanych indeksów
Naszym kolejnym krokiem jest wypełnienie listy indeksów stopniem fragmentacji 30% lub wyższym. Musimy wstawić te indeksy do #FregmentedIndexes tabela.
Kwerenda musi wypełnić nazwę schematu, nazwę tabeli i nazwę indeksu, aby wstawić je do tabeli tymczasowej. Spójrz na to zapytanie:
set @IndexFregQuery='SELECT i.[name],o.name,sch.name
FROM [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery
Utwórz dynamiczne zapytanie SQL
Na koniec musimy zbudować dynamiczny ALTER INDEX polecenie i wykonaj je.
Do wygenerowania polecenia używamy pętli WHILE. Iteruje przez #FregmentedIndexes tabeli i wypełnia nazwę schematu, nazwę tabeli i nazwę indeksu, aby zapisać je w @SchemaName , @TableName i @IndexName . Wartości parametrów są dołączane w poleceniu ALTER INDEX.
Kod wygląda następująco:
set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End
Zamknąłem cały kod w sp_index_maintenance procedura składowana utworzona w DBATools Baza danych. Kod jest następujący:
use DBATools
go
Create procedure sp_index_maintenance_daily
@DatabaseName varchar(50)
as
begin
declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))
set @IndexFregQuery='SELECT i.[name],o.name,sch.name
FROM [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery
set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End
End
Gdy procedura jest gotowa, możemy skonfigurować zadanie SQL.
Rozwiń Agent serwera SQL > kliknij prawym przyciskiem myszy Praca > Nowa praca .
Nowa praca otworzy się okno, w którym należy określić żądaną nazwę zadania.
Aby utworzyć etap pracy, przejdź do Kroków sekcja> Nowa przycisk:
Przejdziesz do Kroku Nowa praca okno, aby skonfigurować ten krok.
Wprowadź żądaną nazwę kroku i wprowadź następujący kod w polu tekstowym:
use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'
Aby skonfigurować harmonogram, przejdź do Harmonogramy > kliknij Nowy .
Nasza praca powinna być wykonana o godzinie 1:00. W związku z tym konfigurujemy harmonogram:
- Typ harmonogramu > Powtarzalne .
- Częstotliwość sekcja> Występuje > Codziennie ; Powtarza się co > 1 (jeden).
- Częstotliwość dzienna sekcja> Występuje raz o > 01:00:00.
- Kliknij OK .
Zostaniesz przeniesiony z powrotem do nowej pracy Sekcja. Kliknij OK tam też, aby stworzyć pracę.
Nowo utworzona oferta pracy jest dostępna w sekcji Praca katalogu w agencie serwera SQL folder.
Musimy teraz przetestować zadanie:kliknij je prawym przyciskiem myszy i wybierz Rozpocznij zadanie…
Zadanie rozpoczyna się, a po pomyślnym zakończeniu zobaczysz następujący komunikat:
Jeśli porównamy indeks klastrowany z indeksem nieklastrowanym, zobaczymy, że utworzenie unikalnego indeksu klastrowego zwiększa wydajność wykonywania zapytań. Widoki indeksowane w SQL Server mogą być używane do przyspieszenia wykonywania zapytań. Sprawdź także, jak zarządzać indeksami za pomocą SQL Index Manager.
Podsumowanie
W niniejszym artykule przedstawiono trzy funkcjonalne sposoby przebudowy indeksów wszystkich tabel. Przeanalizowaliśmy je wszystkie ze szczegółowymi wskazówkami i praktycznymi przykładami indeksów SQL, aby zilustrować konfigurację zadania. Wybór odpowiedniego wariantu należy do Ciebie i mamy nadzieję, że ten artykuł był dla Ciebie pomocny.