sql >> Database >  >> RDS >> Sqlserver

3 methoden om alle indexen voor alle tabellen opnieuw op te bouwen met T-SQL in SQL Server-database

Er zijn verschillende methoden om alle indexen van alle tabellen in SQL Server opnieuw op te bouwen, waaronder:

  1. SQL Server-onderhoudsplannen gebruiken.
  2. T-SQL-script gebruiken op basis van het fragmentatiepercentage.
  3. Het ALTER INDEX-commando gebruiken.

In dit artikel zullen we deze methoden onderzoeken en illustreren met praktische voorbeelden.

1. SQL Server Rebuild Index Onderhoudsplan

De eerste optie die u moet bekijken, is het opnieuw opbouwen van indexen met de onderhoudsplannen voor de database. De onderhoudsplannen zijn beschikbaar onder de beheermap van SQL Server Management Studio.

Om een ​​onderhoudsplan voor een SQL-database te maken, start u SQL Server Management Studio > breid de database-instantie uit > Beheer > klik met de rechtermuisknop op het onderhoudsplan > Nieuw onderhoudsplan .

Geef de naam van het onderhoudsplan op. Sleep vervolgens Rebuild Index Task in de onderhoudsplanontwerper. Hernoem de taak naar Indexonderhoud .

De volgende stap is het configureren van het onderhoudsplan. Dubbelklik erop en configureer de opties op de Rebuild Index Task als volgt:

  • Selecteer AdventureWorks2017 database uit het vervolgkeuzemenu Database(s).
  • Als u de indexen van alle tabellen opnieuw wilt opbouwen, selecteert u Tabellen en weergaven van het Object vervolgkeuzelijst.
  • Controleer Sorteer resultaten in tempdb .
  • MAXDOP – stel 2 in (twee).
  • In ons geval bouwen we indexen alleen opnieuw op als de Fragmentatie waarde hoger is dan 20%. Stel daarom 20 . in in het betreffende veld.
  • Klik op OK om de indexconfiguratie op te slaan en de Rebuild Index Task . te sluiten venster.

Laten we nu het schema configureren.

Klik op de agenda icoon bovenaan de onderhoudsplanontwerper:

Het Nieuwe takenschema venster zal openen. Laten we de volgende instellingen configureren:

  • Voer de taak elke dag uit. In het Schematype menu, selecteren we Terugkerend . Dan, in de Frequentie sectie, selecteren we Ocurs > Dagelijks .
  • Keert elke keer terug > 1 (dag).
  • Dagelijkse frequentie > Komt één keer voor > specificeer de exacte tijd. In ons geval is het 1 uur 's nachts.
  • Klik op OK .

Sla daarna het onderhoudsplan op.

De gemaakte onderhoudsplannen zijn beschikbaar in het SSMS Onderhoudsplan map. Om het schema te zien dat aan het specifieke onderhoudsplan is gekoppeld, controleert u de Vacatures directory onder SQL Server Agent .

Om de taak te testen, klikt u met de rechtermuisknop op de naam in de Onderhoudsplannen map en selecteer Uitvoeren uit het menu:

De uitvoering begint. Als het succesvol is voltooid, ziet u het volgende dialoogvenster:

Dit was de gebruikelijke methode voor het opnieuw opbouwen van indexen met onderhoudsplannen. Laten we nu verder gaan met de volgende methode – met behulp van de T-SQL-scripts.

2. SQL Server ALTER INDEX Opnieuw opbouwen

De opdracht ALTER INDEX kan worden gebruikt om alle indexen van de tabel opnieuw op te bouwen. De syntaxis is als volgt:

ALTER INDEX ALL ON [table_name] REBUILD

Opmerking:de table_name parameter specificeert de naam van de tabel waarin we alle indexen in SQL Server willen herbouwen.

We willen bijvoorbeeld alle indexen van [HumanResources].[Employee] opnieuw opbouwen . De vraag zou als volgt moeten zijn:

use AdventureWorks2017
go
ALTER INDEX ALL ON [HumanResources].[Employee] REBUILD
Go

3. SQL Server-script om alle indexen voor alle tabellen opnieuw op te bouwen op basis van fragmentatie

Indexonderhoud is arbeidsintensief. Bovendien vergrendelt het de tabel waar het de index opnieuw opbouwt. Om dergelijke complicaties te voorkomen, moeten we de index opnieuw opbouwen waar de fragmentatie van de SQL Server-index hoger is dan 40%.

Om het geval te illustreren, heb ik een T-SQL-script gemaakt dat indexen herbouwt met een fragmentatiegraad van meer dan 30%. Laten we de onderdelen en functies ervan verkennen.

Variabelen en tijdelijke tabeldeclaratie

Eerst moeten we tijdelijke tabellen en variabelen maken:

  • @IndexFregQuery – slaat de dynamische zoekopdracht op die wordt gebruikt om gefragmenteerde indexen te vullen.
  • @IndexRebuildQuery – bevat de ALTER INDEX-query.
  • @IndexName – de indexnaam die we willen herbouwen
  • @TableName – de tabelnaam waar we de index willen herbouwen.
  • @SchemaName – de schemanaam waar we de index willen herbouwen.
  • #Fregmentedindex – de tabel met 3 kolommen die de indexnaam, de tabelnaam en de schemanaam opslaat.

De volgende code declareert onze variabelen en de tijdelijke tabel:

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))

De lijst met gefragmenteerde indexen ophalen

Onze volgende stap is om de lijst van indexen te vullen met een fragmentatiegraad van 30% of hoger. We moeten die indexen invoegen in de #FregmentedIndexes tafel.

De query moet de schemanaam, de tabelnaam en de indexnaam invullen om ze in de tijdelijke tabel in te voegen. Kijk eens naar die vraag:

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

Maak een dynamische SQL-query

Ten slotte moeten we de dynamische ALTER INDEX . bouwen commando en voer het uit.

Om de opdracht te genereren, gebruiken we de WHILE-lus. Het herhaalt de #FregmentedIndexes tabel en vult de schemanaam, de tabelnaam en de indexnaam in om ze op te slaan in @SchemaName , @TableName , en @IndexName . De waarden van de parameters worden toegevoegd aan het ALTER INDEX-commando.

De code is de volgende:

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

Ik heb de volledige code ingekapseld in de sp_index_maintenance opgeslagen procedure gemaakt in de DBATools databank. De code is als volgt:

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

Zodra de procedure gereed is, kunnen we de SQL Job configureren.

Vouw SQL Server-agent uit > klik met de rechtermuisknop op Vacatures > Nieuwe baan .

De Nieuwe Baan venster wordt geopend waar u de gewenste taaknaam moet opgeven.

Om een ​​taakstap aan te maken, gaat u naar de Stappen sectie> de Nieuwe knop:

U komt bij de Nieuwe taakstap venster om die stap te configureren.

Voer de gewenste stapnaam in en voer de volgende code in het tekstvak in:

use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'

Om het schema te configureren, ga naar Schema's > klik op Nieuw .

Ons werk moet om 1:00 uur worden uitgevoerd. Dienovereenkomstig configureren we het schema:

  • Plantype > Terugkerend .
  • De Frequentie sectie> Doet zich voor > Dagelijks ; Keert elke . terug > 1 (één).
  • De Dagelijkse frequentie sectie> Komt één keer voor op > 01:00:00.
  • Klik op OK .

U wordt teruggeleid naar de Nieuwe baan sectie. Klik op OK daar ook om de baan te creëren.

De nieuw aangemaakte vacature is beschikbaar in de Vacatures directory onder de SQL Server Agent map.

We moeten nu de taak testen:klik er met de rechtermuisknop op en selecteer Start Job …

De taak begint en bij succesvolle voltooiing ziet u het volgende bericht:

Als we een geclusterde index vergelijken met een niet-geclusterde index, zullen we zien dat het maken van een unieke geclusterde index de efficiëntie van de queryprestaties verhoogt. Geïndexeerde weergaven in SQL Server kunnen worden gebruikt om de uitvoering van query's te versnellen. Bekijk ook hoe u indexen beheert met SQL Index Manager.

Samenvatting

Het huidige artikel presenteerde drie functionele manieren om indexen van alle tabellen opnieuw op te bouwen. We hebben ze allemaal onderzocht met stapsgewijze richtlijnen en praktische SQL-indexvoorbeelden om de taakconfiguratie te illustreren. De keuze van de geschikte variant is aan u en we hopen dat dit artikel u heeft geholpen.


  1. Converteer Datetime-kolom van UTC naar lokale tijd in select-statement

  2. Wat is de beste werkwijze voor primaire sleutels in tabellen?

  3. Verticale randen toevoegen aan uw SQL*Plus / SQLcl-uitvoerraster

  4. Importeer meerdere CSV-bestanden naar SQL Server vanuit een map