SQL Database è il servizio di Microsoft Azure che ci permette di usare SQL Server sul cloud. L'ambiente è completamente gestito e configurabile attraverso il portale web. La gestione dei file e dei backup è automatizzata, tanto che a noi non rimane altro che utilizzarlo e scegliere il dimensionamento in termini di spazio massimo e prestazioni.
E' così comodo che finiamo per dimenticarci di alcuni aspetti della manutenzione, in particolare gli indici. Sono praticamente sempre presenti, almeno quelli clustered per le chiavi primarie, e sono sottoposti alla frammentazione che con il passare del tempo si può verificare a causa di continui aggiornamenti, inserimenti e cancellazioni di righe. Questo causa un rallentamento nelle query che ne fanno uso ed è perciò importante tenere monitorata la situazione e se necessario ricostruire gli indici.
Per farlo possiamo usare i comandi SQL. Con lo snippet seguente, per esempio, viene mostrato come visualizzare la frammentazione per ogni indice di ogni tabella, ordinata per la percentuale.
SELECT OBJECT_NAME(ps.object_id) AS TableName ,i.name AS IndexName ,ips.avg_fragmentation_in_percent FROM sys.dm_db_partition_stats ps INNER JOIN sys.indexes i ON ps.object_id = i.object_id AND ps.index_id = i.index_id CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), ps.object_id, ps.index_id, null, 'LIMITED') ips ORDER BY ips.avg_fragmentation_in_percent DESC
Una volta stabilita quale tabella ricostruire possiamo lanciare il comando ALTER INDEX ALL, oppure ancora lanciare la ricostruzione di tutti gli indici, come nello snippet seguente.
DECLARE @TableName sysname DECLARE TableCursor CURSOR FOR ( SELECT '[' + IST.TABLE_SCHEMA + '].[' + IST.TABLE_NAME + ']' AS [TableName] FROM INFORMATION_SCHEMA.TABLES IST WHERE IST.TABLE_TYPE = 'BASE TABLE' ) OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName WHILE @@FETCH_STATUS = 0 BEGIN PRINT('Rebuilding Indexes on ' + @TableName) Begin Try EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD with (ONLINE=ON)') End Try Begin Catch PRINT('Cannot do rebuild with Online=On option, taking table ' + @TableName+' down for douing rebuild') EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD') End Catch FETCH NEXT FROM TableCursor INTO @TableName END CLOSE TableCursor DEALLOCATE TableCursor
La ricostruzione degli indici può essere fatta online, mantenendoli online e quindi disponibili per le query, ma più lenti nella ricostruzione. Oppure offline, più veloci nella ricostruzione, ma andando ad influire sulle query che ne fanno uso. Questa modalità inoltre è obbligatoria su tabelle che dispongono di colonne di larga dimensione, come NVARCHAR(max). Per questo motivo lo script precedente tenta sempre una ricostruzione online e nel caso non abbia successo, riprova con una offline.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire liste di tipi semplici con Entity Framework Core
Utilizzare Azure Cosmos DB con i vettori
Utilizzare una qualunque lista per i parametri di tipo params in C#
Creare gruppi di client per Event Grid MQTT
Eliminare una project wiki di Azure DevOps
Migliorare l'organizzazione delle risorse con Azure Policy
Gestione dell'annidamento delle regole dei layer in CSS
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Utilizzare un service principal per accedere a Azure Container Registry
Eseguire una ricerca avanzata per recuperare le issue di GitHub
I più letti di oggi
- anche #vs13 update 4 è disponibile in RTM: https://aspit.co/azm
- Indicizzare Cosmos DB con #azure Search https://aspit.co/b4v di @CristianCivera #cosmosdb
- Utilizzare le sequence di SQL Server in Entity Framework Core
- Gestire l'accelerometro nelle applicazioni Silverlight per Windows Phone
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Modificare i metadati nell'head dell'HTML di una Blazor Web App
- stando a @edbott, la consumer preview di #win8 sarà rilasciata il 29 febbraio! http://aspitalia.com/42
- il supporto di #vs 10 a #netmicrofx arriverà resto. ecco la roadmap aggiornata: http://u.aspitalia.com/hh #vs10ita
- #aspilive: ancora @dbochicchio con le novità di #aspnet45 e #webforms. seguici live su https://aspit.co/vs12-live