Nedílnou součástí správy databáze z pohledu výkonu je pravidelná údržba indexů, zejména tam, kde databáze není určena především pro čtení, ale míra DML operací převažuje nad čtením dat. Pomocí přiloženého skriptu je možné provést jednorázový rebuild všech indexů ve všech databázích na spravované instanci, případně skript upravit tak, aby rebuildoval indexy pouze v jedné nebo více zvolených databázích.
Součástí skriptu je i možnost konfigurace fill factoru indexů po rebuildu, která určuje míru zaplnění jednotlivých datových stránek indexu a umožňuje tak předejít dělení stránek indexu (page splits) při DML operacích. Fill factor se udává v procentech, kdy 0 a 100 znamenají 100% zaplnění datových stránek.
DECLARE @Database NVARCHAR(128) DECLARE @Table NVARCHAR(128) DECLARE @FillFactor INT DECLARE @Stmt NVARCHAR(MAX) SET @FillFactor = 90 DECLARE curDatabase CURSOR FOR SELECT name FROM master.dbo.sysdatabases --WHERE name = DB_NAME() ORDER BY 1 OPEN curDatabase FETCH NEXT FROM curDatabase INTO @Database WHILE @@FETCH_STATUS = 0 BEGIN PRINT @Database SET @Stmt = 'DECLARE curTable CURSOR FOR SELECT table_catalog + ''.'' + table_schema + ''.'' + table_name as TableName FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE''' EXECUTE(@Stmt) OPEN curTable FETCH NEXT FROM curTable INTO @Table WHILE @@FETCH_STATUS = 0 BEGIN PRINT '-->' + @Table SET @Stmt = 'ALTER INDEX ALL ON [' + @Table + '] REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3), @FillFactor) + ')' EXECUTE(@Stmt) FETCH NEXT FROM curTable INTO @Table END CLOSE curTable DEALLOCATE curTable FETCH NEXT FROM curDatabase INTO @Database END CLOSE curDatabase DEALLOCATE curDatabase