0

我想对 sql server 中的表进行碎片整理,我使用这段代码来了解碎片索引:

sELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
 indexstats.avg_fragmentation_in_percent as Fragmentation, 
 indexstats.page_count
  FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) 
  AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] =  indexstats.[object_id] 
 INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] 
 INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
 AND indexstats.index_id = dbindexes.index_id 
 WHERE indexstats.database_id = DB_ID() ORDER BY    indexstats.avg_fragmentation_in_percent
 desc 

在我得到我使用的结果之后

 DBCC INDEXDEFRAG([MAIL SYSTEMS],EmpMail)

对索引进行碎片整理,然后重用第一个代码来显示结果,它在碎片整理之前显示相同并且没有删除任何页面?那有什么问题,我该如何修复索引?

4

2 回答 2

0

试试这段代码,这将根据碎片级别对所有索引进行碎片整理。

SELECT CASE
         WHEN indexstats.avg_fragmentation_in_percent > 5
              AND indexstats.avg_fragmentation_in_percent <= 30 THEN 'ALTER INDEX [' + ind.NAME + '] ON ['
                                                                     + Object_name(ind.OBJECT_ID)
                                                                     + '] REORGANIZE ; '
         ELSE 'ALTER INDEX [' + ind.NAME + '] ON ['
              + Object_name(ind.OBJECT_ID) + '] REBUILD; '
       END,
       'GO'
FROM   sys.Dm_db_index_physical_stats(Db_id(), NULL, NULL, NULL, NULL) indexstats
       INNER JOIN sys.indexes ind
               ON ind.object_id = indexstats.object_id
                  AND ind.index_id = indexstats.index_id
WHERE  indexstats.avg_fragmentation_in_percent > 10
       AND ind.NAME IS NOT NULL
ORDER  BY indexstats.avg_fragmentation_in_percent DESC
于 2015-12-26T13:16:43.647 回答
0

这是 StackUser 脚本的修改版本,它直接执行生成的命令并额外打印有关已处理索引及其碎片状态的漂亮信息消息:

DECLARE @sql VARCHAR(MAX) =
(
    SELECT CASE
        WHEN indexstats.avg_fragmentation_in_percent > 5
         AND indexstats.avg_fragmentation_in_percent <= 30
        THEN
            'PRINT ''Reorganizing index [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] with ' +
            CAST(indexstats.avg_fragmentation_in_percent AS VARCHAR(10)) + ' % fragmentation ...''; ' +
            'ALTER INDEX [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] REORGANIZE ; '
        ELSE
            'PRINT ''Rebuilding index [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] with ' +
            CAST(indexstats.avg_fragmentation_in_percent AS VARCHAR(10)) + ' % fragmentation ...''; ' +
            'ALTER INDEX [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] REBUILD; '
        END
    FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
    INNER JOIN sys.indexes ind
        ON ind.object_id = indexstats.object_id AND ind.index_id = indexstats.index_id
    WHERE indexstats.avg_fragmentation_in_percent > 10 AND ind.name IS NOT NULL
    ORDER BY indexstats.avg_fragmentation_in_percent DESC
    FOR XML PATH('')
);
EXEC (@sql)

此外,还有来自 MSDN 的类似脚本:https ://docs.microsoft.com/de-de/sql/t-sql/database-console-commands/dbcc-indexdefrag-transact-sql?view=sql-server-版本 15

于 2020-07-17T00:19:33.047 回答