我正在使用以下查询来检查表上的索引碎片。每个索引返回 3 行,每一行都有不同的“avg_fragmentation_in_percent”值。当我通过实际索引的属性菜单检查索引碎片时,第二行似乎是准确的值。
我对返回的其他值很好奇,因为一行表示 100% 碎片而另一行表示 0% 碎片。有谁知道我为什么会看到这个?
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;
SET @db_id = DB_ID(N'wfm');
SET @object_id = OBJECT_ID(N'wfm.dbo.Lab_Employee_Time_Off');
IF @db_id IS NULL
BEGIN;
PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT OBJECT_NAME(ips.OBJECT_ID) AS 'TableName'
,i.NAME AS 'IndexName'
,ips.index_id
,ips.index_type_desc
,ips.avg_fragmentation_in_percent
,ips.avg_page_space_used_in_percent
,ips.page_count
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL, 'DETAILED') ips
INNER JOIN sys.indexes i ON (ips.object_id = i.object_id)
AND (ips.index_id = i.index_id)
ORDER BY i.name, avg_fragmentation_in_percent DESC
END;
GO
索引中的每个级别都有一行(添加
ips.index_level
到输出中,您会看到每个级别都有一行)。您的查询可能应该简单地过滤掉任何页数较少的行(例如,1000),这将在大多数情况下消除除级别 0 之外的所有行。