SQL Server

Rebuild všech indexů v databázi

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

 

Leave a Reply

Your email address will not be published. Required fields are marked *