记录一个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」版。查看和发表评论请点击:完整版 »