Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

3 metody odbudowy wszystkich indeksów dla wszystkich tabel za pomocą T-SQL w bazie danych SQL Server

Istnieje kilka metod odbudowy wszystkich indeksów wszystkich tabel w SQL Server, między innymi:

  1. Korzystanie z planów konserwacji SQL Server.
  2. Korzystanie ze skryptu T-SQL w oparciu o procent fragmentacji.
  3. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak napisać UPDATE SQL z aliasem tabeli w SQL Server 2008?

  2. Kopia zapasowa SQL Server 2017 -3

  3. Jakie jest znaczenie 1/1/1753 w SQL Server?

  4. Używanie sp_help_schedule w SQL Server

  5. Pogrupuj sql według versus different