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
