【发布时间】:2014-02-26 17:36:15
【问题描述】:
我正在运行以下查询来获取索引外部碎片:
SELECT SCH.[name] as 'Schema'
,TBL.[name] as 'Table'
,IX.[name] as 'Index'
,IXStats.[avg_fragmentation_in_percent]
,IXStats.[page_count]
FROM [sys].[dm_db_index_physical_stats] (DB_ID(), NULL, NULL, NULL, NULL) AS IXStats
INNER JOIN [sys].[tables] AS TBL
on TBL.[object_id] = IXStats.[object_id]
INNER JOIN [sys].[schemas] SCH
on TBL.[schema_id] = SCH.[schema_id]
INNER JOIN [sys].[indexes] AS IX
ON IX.[object_id] = IXStats.[object_id]
AND IXStats.[index_id] = IX.[index_id]
WHERE IXStats.database_id = DB_ID()
ORDER BY IXStats.[avg_fragmentation_in_percent] DESC
对于几个表(没有索引或主键),查询返回碎片。
这怎么可能? SQL Server 是否创建了一些内部索引?
【问题讨论】:
-
@DerU 是的,你是对的 - 有一个
default constraint。我无法使用 Management Studio 获取其碎片,但在这种情况下,碎片是否重要? -
我刚刚检查了在线书籍中的 dm_db_index_physical_stats:technet.microsoft.com/de-de/library/ms188917.aspx。它说:“返回 data 和索引的大小和碎片信息”。这是我的解释:一个堆(没有索引也没有 pk)可以存储在磁盘上的一个连续块中,也可以分散在几个片段中。它具有一定的碎片性。默认约束与碎片无关。
标签: tsql indexing statistics sql-server-2012