MrLin

记录一个SQL Server 重建索引命令

Mark

DECLARE @TableName NVARCHAR(256)
DECLARE @SQL NVARCHAR(MAX)

DECLARE TableCursor CURSOR FAST_FORWARD READ_ONLY FOR
SELECT name FROM sys.tables WHERE type = 'U'

OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'ALTER INDEX ALL ON ' + QUOTENAME(@TableName) + ' REORGANIZE'
    PRINT '正在重新组织表 ' + @TableName + ' 的索引...'
    EXEC sp_executesql @SQL
    
    FETCH NEXT FROM TableCursor INTO @TableName
END

CLOSE TableCursor
DEALLOCATE TableCursor
PRINT '索引维护完成!'

另外一条没通过测试

DECLARE 
    @TableName NVARCHAR(256),
    @IndexName NVARCHAR(256),
    @Fragmentation FLOAT,
    @SQL NVARCHAR(MAX)

DECLARE IndexCursor CURSOR FAST_FORWARD READ_ONLY FOR
SELECT 
    OBJECT_NAME(ips.object_id) AS TableName,
    i.name AS IndexName,
    ips.avg_fragmentation_in_percent AS Fragmentation
FROM 
    sys.dm_db_index_physical_stats(DB_ID('UltimusDB'), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN 
    sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE 
    ips.avg_fragmentation_in_percent > 10  -- 只处理碎片率大于10%的索引
    AND i.type > 0  -- 排除堆
    AND OBJECTPROPERTY(ips.object_id, 'IsMsShipped') = 0  -- 排除系统表

OPEN IndexCursor
FETCH NEXT FROM IndexCursor INTO @TableName, @IndexName, @Fragmentation

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @Fragmentation > 30
    BEGIN
        -- 碎片率大于30%,执行重建
        SET @SQL = 'ALTER INDEX ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@TableName) + 
                   ' REBUILD WITH (FILLFACTOR = 85, SORT_IN_TEMPDB = ON, ONLINE = ON)'
        PRINT '重建索引: ' + @TableName + '.' + @IndexName + ' (碎片率: ' + CAST(@Fragmentation AS VARCHAR(10)) + '%)'
    END
    ELSE
    BEGIN
        -- 碎片率在10%-30%之间,执行重新组织
        SET @SQL = 'ALTER INDEX ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@TableName) + ' REORGANIZE'
        PRINT '重新组织索引: ' + @TableName + '.' + @IndexName + ' (碎片率: ' + CAST(@Fragmentation AS VARCHAR(10)) + '%)'
    END
    
    EXEC sp_executesql @SQL
    
    FETCH NEXT FROM IndexCursor INTO @TableName, @IndexName, @Fragmentation
END

CLOSE IndexCursor
DEALLOCATE IndexCursor
PRINT '索引维护完成!'

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »