Der er flere metoder til at genopbygge alle indekser for alle tabeller i SQL Server, blandt dem:
- Brug af SQL Server-vedligeholdelsesplaner.
- Brug af T-SQL-script baseret på fragmenteringsprocenten.
- Brug ALTER INDEX-kommandoen.
I denne artikel vil vi udforske disse metoder og illustrere dem med praktiske eksempler.
1. SQL Server Rebuild Index Maintenance Plan
Den første mulighed for at gennemgå er at genopbygge indekser med databasevedligeholdelsesplanerne. Vedligeholdelsesplanerne er tilgængelige under administrationsmappen i SQL Server Management Studio.
For at oprette SQL-databasevedligeholdelsesplan skal du starte SQL Server Management Studio > udvid databaseforekomsten > Administration > højreklik på vedligeholdelsesplanen > Ny vedligeholdelsesplan .
Angiv navnet på vedligeholdelsesplanen. Træk og slip derefter Genopbyg indeksopgave ind i vedligeholdelsesplandesigneren. Omdøb opgaven til Indeksvedligeholdelse .
Det næste trin er at konfigurere vedligeholdelsesplanen. Dobbeltklik på det, og konfigurer indstillingerne på Genopbyg indeksopgave som følger:
- Vælg AdventureWorks2017 database fra rullemenuen Database(r).
- For at genopbygge indekser for alle tabeller skal du vælge Tabeller og visninger fra Objektet rullemenu.
- Tjek Sortér resultater i tempdb .
- MAXDOP – sæt 2 (to).
- I vores tilfælde genopbygger vi kun indekser, hvis Fragmentering værdien er højere end 20 %. Indstil derfor 20 i det respektive felt.
- Klik på OK for at gemme indekskonfigurationen og lukke Genopbyg indeksopgaven vindue.
Lad os nu konfigurere tidsplanen.
Klik på kalenderen ikonet oven på vedligeholdelsesplandesigneren:
Ny jobplan vinduet åbnes. Lad os konfigurere følgende indstillinger:
- Kør jobbet hver dag. I Tidsplantype menuen, vælger vi Tilbagevendende . Derefter i Frekvens sektion, vælger vi Forekommer > Dagligt .
- Gentager hver > 1 (dag).
- Daglig frekvens > Forekommer én gang kl. > angiv det præcise tidspunkt. I vores tilfælde er klokken 01.00.
- Klik på OK .
Gem derefter vedligeholdelsesplanen.
De oprettede vedligeholdelsesplaner er tilgængelige i SSMS vedligeholdelsesplanen vejviser. For at se tidsplanen, der er knyttet til den bestemte vedligeholdelsesplan, skal du tjekke Jobs mappe under SQL Server Agent .
For at teste jobbet skal du højreklikke på dets navn i vedligeholdelsesplanerne mappe, og vælg Udfør fra menuen:
Udførelsen starter. Når det er gennemført, vil du se følgende dialogboks:
Dette var den almindelige metode til at genopbygge indekser med vedligeholdelsesplaner. Lad os nu gå videre til den næste metode – ved hjælp af T-SQL-scripts.
2. SQL Server ALTER INDEX Genopbygning
ALTER INDEX kommandoen kan bruges til at genopbygge alle indekser i tabellen. Syntaksen er følgende:
ALTER INDEX ALL ON [table_name] REBUILD
Bemærk:tabelnavn parameter angiver navnet på den tabel, hvor vi ønsker at genopbygge alle indekser i SQL Server.
For eksempel ønsker vi at genopbygge alle indekser af [HumanResources].[Employee] . Forespørgslen skal være som følger:
use AdventureWorks2017
go
ALTER INDEX ALL ON [HumanResources].[Employee] REBUILD
Go
3. SQL Server Script til at genopbygge alle indekser for alle tabeller baseret på fragmentering
Indeksvedligeholdelse er ressourcekrævende. Desuden låser den bordet, hvor den genopbygger indekset. For at undgå sådanne komplikationer skal vi genopbygge indekset, hvor SQL Server-indeksfragmenteringen er højere end 40 %.
For at illustrere sagen har jeg lavet et T-SQL script, der genopbygger indekser med en fragmenteringsgrad højere end 30%. Lad os udforske dens dele og funktioner.
Variabler og midlertidig tabelerklæring
Først skal vi oprette midlertidige tabeller og variable:
- @IndexFregQuery – gemmer den dynamiske forespørgsel, der bruges til at udfylde fragmenterede indekser.
- @IndexRebuildQuery – indeholder ALTER INDEX-forespørgslen.
- @IndexName – det indeksnavn, vi ønsker at genopbygge
- @Tabelnavn – tabelnavnet, hvor vi ønsker at genopbygge indekset.
- @SchemaName – skemanavnet, hvor vi ønsker at genopbygge indekset.
- #Fregmentedindex – tabellen med 3 kolonner der gemmer indeksnavnet, tabelnavnet og skemanavnet.
Følgende kode erklærer vores variabler og temp-tabellen:
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))
Få listen over fragmenterede indekser
Vores næste trin er at udfylde listen over indekser med en fragmenteringsgrad på 30 % eller højere. Vi skal indsætte disse indekser i #FregmentedIndexes tabel.
Forespørgslen skal udfylde skemanavnet, tabelnavnet og indeksnavnet for at indsætte dem i den midlertidige tabel. Tag et kig på den forespørgsel:
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
Opret en dynamisk SQL-forespørgsel
Endelig skal vi bygge det dynamiske ALTER INDEX kommando og udfør den.
For at generere kommandoen bruger vi WHILE-løkken. Det itererer gennem #FregmentedIndexes tabel og udfylder skemanavnet, tabelnavnet og indeksnavnet for at gemme dem i @SchemaName , @Tabelnavn og @IndexName . Parametrenes værdier er tilføjet i ALTER INDEX-kommandoen.
Koden er følgende:
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
Jeg har indkapslet hele koden i sp_index_maintenance lagret procedure oprettet i DBATools database. Koden er følgende:
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
Når proceduren er klar, kan vi konfigurere SQL Job.
Udvid SQL Server Agent > højreklik på Jobs > Nyt job .
Det Nye job vindue åbnes, hvor du skal angive det ønskede jobnavn.
For at oprette et jobtrin skal du navigere til Trinnene sektionen> den Ny knap:
Du kommer til trinnet for nyt job vindue for at konfigurere dette trin.
Indtast det ønskede trinnavn og indtast følgende kode i tekstboksen:
use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'
For at konfigurere tidsplanen skal du gå til Tidsplaner > klik på Ny .
Vores job skal udføres kl. 01:00. Derfor konfigurerer vi tidsplanen:
- Tidsplantype > Tilbagevendende .
- Frekvensen sektion> Forekommer > Dagligt ; Gentager hver > 1 (én).
- Den Daglige frekvens sektion> Forekommer én gang kl. > 01:00:00.
- Klik på OK .
Du vil blive overført tilbage til det Nye job afsnit. Klik på OK der også for at skabe jobbet.
Det nyoprettede job er tilgængeligt i Jobs bibliotek under SQL Server Agent mappe.
Vi skal nu teste jobbet:højreklik på det og vælg Start job …
Jobbet starter, og efter vellykket afslutning vil du se følgende besked:
Hvis vi sammenligner klynget indeks med ikke-klynget indeks, vil vi se, at oprettelse af et unikt klynget indeks øger effektiviteten af forespørgselsydeevnen. Indekserede visninger i SQL Server kan bruges til at fremskynde udførelse af forespørgsler. Se også, hvordan du administrerer indekser ved hjælp af SQL Index Manager.
Oversigt
Den aktuelle artikel præsenterede tre funktionelle måder at genopbygge indekser for alle tabeller på. Vi har udforsket dem alle med trinvise retningslinjer og praktiske SQL-indekseksempler for at illustrere jobkonfigurationen. Valget af den passende variant er dit, og vi håber, at denne artikel var til hjælp for dig.