Nell'articolo precedente abbiamo trattato la stored procedure IndexOptimize di Ola Hallengren, un valido strumento per la manutenzione degli indici. Opportunamente parametrizzata, questa procedura offre anche la possibilità di aggiornare le statistiche di SQL Servercon alcune opzioni davvero interessanti. Andiamo ora a completare la panoramica delle funzionalità disponibili, ponendo il focus sull’aggiornamento delle statistiche.
Cosa sono le statistiche (SQL Server Statistics)?
- Ottimizzare l’esecuzione delle query
- Scelta degli Indici
- Stime più precise dei Costi delle query
- Scelta dei piani di Esecuzione più efficienti
- Gestione del Carico di Lavoro
Microsoft Maintenance Plan – Update Statiscs
- Tutte le statistiche.
- Solo statistiche “di colonna”.
- Solo statistiche “di indici”.
- Scansione completa.
- Scansione analizzando una porzione di righe come valore assoluto o in percentuale.
IndexOptimize – Update Statistics
EXEC IndexOptimize @Databases = 'ALL_DATABASES' ,@UpdateStatistics = 'ALL'
- Databases: indicando la lista dei datatabase che vanno inclusi.
- UpdateStatistics: la tipologia di statistiche che vanno incluse.
IndexOptimize – Update Statistics, elenco parametri
- 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”
- ALL: tutte le statistiche
- INDEX: aggiorna solo statistiche di indice
- COLUMNS: aggiorna solo statistiche di colonna
- NULL: valore di default, in questo caso non viene eseguito nessun aggiornamento
- “Y”: aggiornamento solo se una riga modificata dall’ultima esecuzione
- “N”: aggiornamento in ogni caso
@Execute: permette di specificare se la procedura deve essere eseguita a meno. I valori possibili sono “Y” (Si) o “N” (No), default “Y”.
Indici e Statistiche
Va sottolineato che Indici e Statistiche possono essere mantenuti con lo stesso comando nella stessa sessione: IndexOptimize in base ai parametri forniti eseguire entrambi i comandi uno di seguito all’altro per ogni tabella presa in esame. Nel caso si volesse perseguire questa strada va tenuto conto però dei parametri @Databases e @Indexes in quanto eventuali regole di esclusione su database e/o tabelle valgono per entrambi! Per una spiegazione più dettagliata di questi parametri è possibile consultare il precedente articolo.
Esempio d’uso e schedulazione
Il numero parametri disponibili volendo aggiornare solamente le statistiche è nettamente inferiore alla parte indici, un comando genericamente accettato può essere il seguente:
EXECUTE dbo.IndexOptimize @Databases = 'ALL_DATABASES' ,@UpdateStatistics = 'ALL' ,@OnlyModifiedStatistics = 'Y' ,@LogToTable = 'Y'
- Per tutti i db (@Databases = 'ALL_DATABASES')
- Tutte le tipologie (@UpdateStatistics = 'ALL')
- Solo dove sono state apportate modifiche alle righe
- Loggando il risultato sul DB
1) Dal menu di SQL Server Agent dal menu contestuale avviare la procedura guidata per la creazione di un nuovo job.
2) Aggiungere nome del Job. Impostare come owner un utente con privilegi adeguati solitamente può essere impostata un’utenza dedicata la lancio dei job con permessi elevati.
3) Spostarsi nella tab Steps e aggiungere un nuovo passo con il tasto New …
4) Compilare il nome del passo, selezionare come tipo “T-SQL” e impostare il comando. Impostare il database dove è stata installata IndexOptimize (tipicamente master).
5) Nella tab “Schedules” aggiungere una nuova schedulazione con il tasto New, e impostare la ricorrenza desiderata. Nell’esempio si richiede una schedulazione giornaliera a partire dalle ore 05:00.
6) Nella tab “Notifications” è possibile aggiungere notifiche a completamento o fallimento del job. Nell’esempio è richiesto l’invio di una mail all’operatore DBA se il job fallisce.