深入了解后,使用常见的查询来检索索引碎片化,即使在一个1.5TB的数据库上,返回160行的结果也需要大约一个小时的时间。
SELECT s.name AS schemaname ,
t.name AS tablename ,
t.object_id ,
i.name AS indexname ,
i.index_id ,
x.page_count ,
x.avg_fragmentation_in_percent ,
x.avg_page_space_used_in_percent ,
i.type_desc
FROM sys.dm_db_index_physical_stats(DB_ID(
), NULL, NULL, NULL, 'LIMITED') x
INNER JOIN sys.tables t ON x.object_id = t.object_id
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sys.indexes i ON x.object_id = i.object_id
AND x.index_id = i.index_id
WHERE x.index_id > 0
AND alloc_unit_type_desc = 'IN_ROW_DATA'
AND x.page_count > 1000;
这让我相信,当索引维护例程的这部分运行时,它在新数据库的开始阶段收集初始信息和构建命令时花费了很长时间。
SET @CurrentCommand12 = @CurrentCommand12 +
'SELECT @ParamFragmentationLevel = MAX(avg_fragmentation_in_percent),
@ParamPageCount = SUM(page_count)
FROM sys.dm_db_index_physical_stats(
@ParamDatabaseID, @ParamObjectID, @ParamIndexID, @ParamPartitionNumber, ''LIMITED'')
WHERE alloc_unit_type_desc = ''IN_ROW_DATA'' AND index_level = 0'
EXECUTE sp_executesql @statement = @CurrentCommand12, @params = N'@ParamDatabaseID int,
@ParamObjectID int, @ParamIndexID int, @ParamPartitionNumber int,
@ParamFragmentationLevel float OUTPUT, @ParamPageCount bigint OUTPUT',
@ParamDatabaseID= @CurrentDatabaseID, @ParamObjectID = @CurrentObjectID, @ParamIndexID =
@CurrentIndexID, @ParamPartitionNumber = @CurrentPartitionNumber,
@ParamFragmentationLevel = @CurrentFragmentationLevel OUTPUT, @ParamPageCount =
@CurrentPageCount OUTPUT