Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

3 metodi per ricostruire tutti gli indici per tutte le tabelle con T-SQL nel database di SQL Server

Esistono diversi metodi per ricostruire tutti gli indici di tutte le tabelle in SQL Server, tra cui:

  1. Utilizzo dei piani di manutenzione di SQL Server.
  2. Utilizzo dello script T-SQL basato sulla percentuale di frammentazione.
  3. Utilizzo del comando ALTER INDEX.

In questo articolo esploreremo questi metodi e li illustreremo con esempi pratici.

1. Piano di manutenzione dell'indice di ricostruzione di SQL Server

La prima opzione da rivedere è la ricostruzione degli indici con i piani di manutenzione del database. I piani di manutenzione sono disponibili nella cartella di gestione di SQL Server Management Studio.

Per creare un piano di manutenzione del database SQL, avvia SQL Server Management Studio > espandi l'istanza del database > Gestione > fai clic con il pulsante destro del mouse sul piano di manutenzione > Nuovo piano di manutenzione .

Specificare il nome del piano di manutenzione. Quindi, trascina e rilascia Ricostruisci attività indice nel progettista del piano di manutenzione. Rinomina l'attività in Manutenzione dell'indice .

Il passaggio successivo è la configurazione del piano di manutenzione. Fare doppio clic su di esso e configurare le opzioni su Attività Ricostruisci indice come segue:

  • Seleziona AdventureWorks2017 database dal menu a discesa Database.
  • Per ricostruire gli indici di tutte le tabelle, seleziona Tabelle e viste dall'Oggetto casella a discesa.
  • Seleziona Ordina i risultati in tempdb .
  • MAXDOP – imposta 2 (due).
  • Nel nostro caso, ricostruiremo gli indici solo se la Frammentazione il valore è superiore al 20%. Pertanto, imposta 20 nel rispettivo campo.
  • Fai clic su OK per salvare la configurazione dell'indice e chiudere l'attività Ricostruisci indice finestra.

Ora configuriamo la pianificazione.

Fare clic sul calendario icona nella parte superiore del designer del piano di manutenzione:

Il Nuovo programma di lavoro si aprirà la finestra. Configuriamo le seguenti impostazioni:

  • Esegui il lavoro ogni giorno. Nel Tipo di programma menu, selezioniamo Ricorrente . Quindi, nella Frequenza sezione, selezioniamo Si verifica > Quotidiano .
  • Ricorre ogni > 1 (giorno).
  • Frequenza giornaliera > Si verifica una volta in > specificare l'ora precisa. Nel nostro caso, è l'una di notte.
  • Fai clic su OK .

Successivamente, salva il piano di manutenzione.

I piani di manutenzione creati sono disponibili nel Piano di manutenzione di SSMS directory. Per visualizzare la pianificazione associata al particolare piano di manutenzione, controlla i Lavori directory in SQL Server Agent .

Per testare il lavoro, fai clic con il pulsante destro del mouse sul suo nome nei Piani di manutenzione directory e seleziona Esegui dal menu:

L'esecuzione ha inizio. Al termine, vedrai la seguente finestra di dialogo:

Questo era il metodo comune per ricostruire gli indici con i piani di manutenzione. Ora, passiamo al metodo successivo, utilizzando gli script T-SQL.

2. Rigenera SQL Server ALTER INDEX

Il comando ALTER INDEX può essere utilizzato per ricostruire tutti gli indici della tabella. La sintassi è la seguente:

ALTER INDEX ALL ON [table_name] REBUILD

Nota:il nome_tabella parametro specifica il nome della tabella in cui vogliamo ricostruire tutti gli indici in SQL Server.

Ad esempio, vogliamo ricostruire tutti gli indici di [HumanResources].[Employee] . La query dovrebbe essere la seguente:

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

3. Script di SQL Server per ricostruire tutti gli indici per tutte le tabelle in base alla frammentazione

La manutenzione dell'indice richiede molte risorse. Inoltre, blocca la tabella in cui sta ricostruendo l'indice. Per evitare tali complicazioni, è necessario ricostruire l'indice in cui la frammentazione dell'indice di SQL Server è superiore al 40%.

Per illustrare il caso, ho creato uno script T-SQL che ricostruisce indici con un grado di frammentazione superiore al 30%. Esploriamo le sue parti e funzioni.

Dichiarazione di variabili e tabelle temporanee

Innanzitutto, dobbiamo creare tabelle e variabili temporanee:

  • @IndexFregQuery – memorizza la query dinamica utilizzata per popolare gli indici frammentati.
  • @IndexRebuildQuery – contiene la query ALTER INDEX.
  • @NomeIndice – il nome dell'indice che vogliamo ricostruire
  • @NomeTabella – il nome della tabella in cui vogliamo ricostruire l'indice.
  • @NomeSchema – il nome dello schema in cui vogliamo ricostruire l'indice.
  • #Fregmentedindex – la tabella a 3 colonne che memorizza il nome dell'indice, il nome della tabella e il nome dello schema.

Il codice seguente dichiara le nostre variabili e la tabella temporanea:

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

Ottieni l'elenco degli indici frammentati

Il nostro passaggio successivo consiste nel popolare l'elenco degli indici con un grado di frammentazione del 30% o superiore. Dobbiamo inserire quegli indici nei #FregmentedIndexes tabella.

La query deve popolare il nome dello schema, il nome della tabella e il nome dell'indice per inserirli nella tabella temporanea. Dai un'occhiata a quella domanda:

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

Crea una query SQL dinamica

Infine, dobbiamo creare il dinamico ALTER INDEX comando ed eseguilo.

Per generare il comando, utilizziamo il ciclo WHILE. Scorre gli #FregmentedIndexes tabella e popola il nome dello schema, il nome della tabella e il nome dell'indice per salvarli in @SchemaName , @NomeTabella e @NomeIndice . I valori dei parametri vengono aggiunti nel comando ALTER INDEX.

Il codice è il seguente:

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

Ho incapsulato l'intero codice in sp_index_maintenance stored procedure creata in DBATools Banca dati. Il codice è il seguente:

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

Una volta che la procedura è pronta, possiamo configurare il Job SQL.

Espandi Agente SQL Server > fare clic con il pulsante destro del mouse su Offerte di lavoro > Nuovo lavoro .

Il Nuovo lavoro si apre la finestra in cui è necessario specificare il nome del lavoro desiderato.

Per creare una fase di lavoro, vai a Passaggi sezione> il Nuovo pulsante:

Arriverai al Nuovo passaggio di lavoro finestra per configurare quel passaggio.

Immettere il nome del passaggio desiderato e immettere il seguente codice nella casella di testo:

use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'

Per configurare la pianificazione, vai a Programmi > fai clic su Nuovo .

Il nostro lavoro dovrebbe essere eseguito alle 1:00. Di conseguenza, configuriamo la pianificazione:

  • Tipo di programma > Ricorrente .
  • La Frequenza sezione> Si verifica > Quotidiano ; Ricorre ogni > 1 (uno).
  • La Frequenza giornaliera sezione> Si verifica una volta in > 01:00:00.
  • Fai clic su OK .

Verrai ritrasferito al Nuovo lavoro sezione. Fare clic su OK anche lì per creare il lavoro.

Il lavoro appena creato è disponibile nei Offerte di lavoro directory in SQL Server Agent cartella.

Ora dobbiamo testare il lavoro:fai clic destro su di esso e seleziona Avvia lavoro...

Il lavoro si avvia e, al completamento con successo, vedrai il seguente messaggio:

Se confrontiamo l'indice cluster con l'indice non cluster, vedremo che la creazione di un indice cluster univoco aumenta l'efficienza delle prestazioni della query. Le viste indicizzate in SQL Server possono essere utilizzate per velocizzare l'esecuzione delle query. Scopri anche come gestire gli indici utilizzando SQL Index Manager.

Riepilogo

L'articolo corrente ha presentato tre modi funzionali per ricostruire gli indici di tutte le tabelle. Li abbiamo esplorati tutti con linee guida dettagliate ed esempi pratici di indici SQL per illustrare la configurazione del lavoro. La scelta della variante adatta è tua e speriamo che questo articolo ti sia stato di aiuto.