2012-06-08 47 views
1

我有一个非常简单的,标准查询,以显示我在数据库中索引碎片,具体如下:TSQL索引碎片查询返回混乱的数据

SELECT DB_NAME(DB_ID()) AS DatabaseName, 
    OBJECT_NAME(ddips.[object_id]) AS TableName, 
    ind.[name] AS IndexName, 
    ddips.index_type_desc AS IndexType, 
    ddips.avg_fragmentation_in_percent AS FragmentationPercentage, 
    ddips.fragment_count AS FragmentCount, 
    ddips.avg_fragment_size_in_pages AS AvgFragmentSizeInPages, 
    ddips.page_count AS [PageCount] 
FROM sys.dm_db_index_physical_stats (DB_ID(), null, null, null, null) AS ddips 
    INNER JOIN sys.indexes ind on ind.[object_id] = ddips.[object_id] 
ORDER BY ddips.avg_fragmentation_in_percent DESC 

当我运行它,但是,我看到确切的相同的数据 - 相同的表名,索引名和索引类型 - 通过不同的碎片百分比多次返回。下面是一个例子:

Fragmentation

我不明白这些结果。当我在SSMS中打开表格时,打开索引并转到碎片页面,它告诉我最低的数字1.71%是碎片。所有这些其他碎片数字来自哪里?任何人都可以解释这些结果吗?非常感谢。

+1

将'AND ind.index_id = ddips.index_id'添加到您的连接条件,将'index_depth'添加到'SELECT'列表。 –

+0

谢谢......我知道这是一个新手问题。我给了mdoyle答案,尽管你首先得到答案......有没有办法将你的评论标记为答案?如果你关心信用。 – Skkra

回答

2

您正在对两个视图中的object_id进行连接,但这不是唯一值。 object_id的多个值的出现意味着多行联接。你需要在连接条件中包含index_id。 编辑:叶,马丁史密斯说什么!

+1

谢谢你和马丁史密斯两人! – Skkra