Microsoft Maintenance Plan
Per la manutenzione degli indici, nello specifico, le possibilità offerte sono due:
Rebuild Index Task: per la ricostruzione indici.
Reorganize Index Task: per la riorganizzazione.
All’interno dei due blocchi è poi possibile personalizzare il task specificando:
- La connessione e quindi su quale istanza eseguire l’operazione.
- Su quali database eseguire il task.
- Gli oggetti specifici da includere se nel punto precedente è stato selezionato un solo database.
Nella parte bassa della maschera sicuramente i punti salienti per entrambi i casi sono le soglie di elaborazione:
“Fragmentation >”: ovvero considerare solamente indici con una frammentazione superiore ad una certa soglia.
“Page Count >”: ovvero considerare solamente indici con un certo numero di pagine (per semplificare si immagini la dimensione in termine di record dell’indice).
“Used in last”: ovvero considerare solamente indici che sono stati utilizzati recentemente in base alla soglia.
IndexOptimize
- Facile da installare e alta portabilità.
- Alto livello di parametrizzazione.
- Possibilità di combinare assieme in un unico comando Rebuild e Reorganize.
- La gran parte dei parametri è già di default impostata su valori ampiamente accettati dalla community SQL Server validi per le installazioni più comuni.
Installare IndexOptimize
IndexOptimize, come detto, è una stored procedure, è facilmente scaricabile dal sito https://ola.hallengren.com/downloads.html come parte di una suite di comandi o singolarmente sotto forma di script di creazione sql.
Basta l’esecuzione dello script per installarla sull’istanza bersaglio.
Può essere creata in qualsiasi database a necessità, tipicamente sul database master.
Come si utilizza IndexOptimize
Per lanciare una ricostruzione indici basta quindi eseguire la stored procedure precedentemente installata, il parametro minimo da fornire è quali database presenti sull’istanza si vuole vengano inclusi con il parametro “@Databases”.
EXEC [master].dbo.IndexOptimize @Databases = 'ALL_DATABASES'
IndexOptimize, parametri operativi
- ALL_DATABASES: tutti i database.
- SYSTEM_DATABASES: tutti i database di sistema.
- USER_DATABASES: tutti i database definiti dagli utenti.
- AVAILABILITY_GROUP_DATABASES: tutti i database presenti in Availability Group.
- “ - “: per indicare di escludere un certo database.
- “%”: come caratteri jolly per le ricerche con wildcard
EXEC [master].dbo.IndexOptimize @Databases = “SYSTEM_DATABASES ,Advent % ,- AdventureWorks2019”
- @FragmentationLow: comandi da eseguire in presenza di soglia bassa inferiore al primo valore di soglia (tipicamente nessuna operazione).
- @FragmentationMedium: comandi da eseguire in presenza di soglia media maggiore al primo valore di soglia ma inferiore al secondo (tipicamente reorganize).
- @FragmentationHigh: comandi da eseguire in presenza di soglia alta maggiore al secondo valore (tipicamente rebuild).
- INDEX_REBUILD_ONLINE: ricostruzione online (se supportata) dell’indice.
- INDEX_REBUILD_OFFLINE: ricostruzione offline dell’indice.
- INDEX_REORGANIZE: riorganizzazione dell’indice.
- NULL: nessuna azione.
- FragmentationLevel1: percentuale di frammentazione per cui un valore maggiore o uguale è considerato del tipo @FragmentationMedium.
- FragmentationLevel2: percentuale di frammentazione per cui un valore maggiore o uguale è considerato del tipo @FragmentationHigh.
EXEC [master].dbo.IndexOptimize @Databases = “ALL_DATABASES” ,@FragmentationLow = NULL ,@FragmentationMedium = 'INDEX_REORGANIZE' ,@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE' ,@FragmentationLevel1 = 30 ,@FragmentationLevel2 = 70
- per tutti gli indici frammentati sotto il 30% (@FragmentationLevel1 = 30) non eseguire nessuna attività (@FragmentationLow = NULL);
- per tutti quelli compresi tra 30 e 70 (@FragmentationLevel1 = 30, @FragmentationLevel2 = 70) esegui se una riorganizzazione (@FragmentationMedium = 'INDEX_REORGANIZE');
- per quelli superiore una rebuild online se possibile altrimenti offline (@FragmentationHigh = 'INDEX_REBUILD_ONLINE, INDEX_REBUILD_OFFLINE').
- MinNumberOfPages: indici con meno pagine del valore impostato, di default 1000 come da suggerimenti Microsoft.
- MaxNumberOfPages: indici con più pagine del valore impostato, di default non è impostata soglia.
EXEC [master].dbo.IndexOptimize @Databases = “ALL_DATABASES” ,@MinNumberOfPages = 500 ,@MaxNumberOfPages = 500000
- anteporre “-” ad un oggetto in lista indica esclusione mentre
- “%” va approfondito va contestualizzato alla posizione in cui si inserisce
Update statistics
Un esempio pratico di utilizzo
- MAG: database di gestione del magazzino
- GEST: database gestionale e amministrativo
- DOC: database documentale
EXEC [master].dbo.IndexOptimize @Databases = “MAG” ,@FragmentationLow = NULL ,@FragmentationMedium = 'INDEX_REORGANIZE' ,@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE' ,@FragmentationLevel1 = 50 ,@FragmentationLevel2 = 80 ,@Indexes = “ALL_INDEXES” ,@MinNumberOfPages = 1000 ,@LockTimeout = 120 ,@LockMessageSeverity = 10 ,@Timelimit = 14400 ,@LogToTable = ‘Y’
EXEC [master].dbo.IndexOptimize @Databases = “ALL_DATABASES” ,@FragmentationLow = NULL ,@FragmentationMedium = 'INDEX_REORGANIZE' ,@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE' ,@FragmentationLevel1 = 5 ,@FragmentationLevel2 = 30 ,@Indexes = “ALL_INDEXES ,- DOC.log.% ,- DOC.%.% _Storico ,- GEST.%.STO_ % ” ,@LockTimeout = 30 ,@LockMessageSeverity = 16 ,@LogToTable = ‘Y’
Conclusione
Con questo articolo si è voluto far scoprire un’alternativa ai piani classici di manutenzione Microsoft. Con un minimo di conoscenza dei parametri accettati è possibile avere una forte personalizzazione dell’attività cucita al meglio alle necessità di ogni installazione.
di Riccardo Trattenero, pubblicato il 13 giugn0 2024
Fonti:
https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html