我使用Ola Hallengrens脚本进行索引维护。在此之前,我使用以下查询来查看哪些索引最分散:
SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
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
ORDER BY indexstats.avg_fragmentation_in_percent desc
在我的情况下,avg_fragmentation 对于15个索引而言超过70%,对于28个索引而言超过30%。
因此,我使用Ola Hallengren的解决方案重建了每个索引。当我再次运行查询时,结果如下:
碎片超过70%为12个索引,超过30%为15个索引。
我认为,原因是因为page_count
仍然非常分散的每个索引的均小于1000。例如,具有page_count
967 的索引之一的
碎片百分比为98,98%!对我来说,似乎值得重建该索引!我这样做了,之后,碎片是0%。另外,a page_count
值为132 的指数从95%变为0%
所以,我的问题是,为什么不重建那些索引会有什么原因?原因之一可能是重建需要花费时间和资源,但是由于索引较小,这是否意味着花费相对较少的资源并且无论如何仍然要进行重建?
这个站点上有多个相关问题,但是所有这些问题都回答了为什么索引不进行碎片整理,或者如果索引很小并且您不对它们进行碎片整理,索引是否仍然有用,而在这里,该语句确实减少了碎片,问题是,为什么不这样做呢?