我运行了这个查询:
SELECT
i.name AS IndexName,
s.used_page_count * 8 AS IndexSizeKB
FROM sys.dm_db_partition_stats AS s
JOIN sys.indexes AS i
ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
WHERE s.[object_id] = object_id('dbo.Stu')
ORDER BY i.name
并且返回的最大索引具有NULL名称。这是什么意思?
答案 0 :(得分:11)
答案 1 :(得分:5)
sys.indexes视图不仅显示索引,还显示没有索引的表。这些表称为堆。在这种情况下,没有索引的名称。我同意,这可能会产生误导。
SELECT i.object_id, i.type_desc,
i.name AS IndexName,
s.used_page_count * 8 AS IndexSizeKB
FROM sys.dm_db_partition_stats AS s
JOIN sys.indexes AS i
ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
WHERE s.[object_id] = object_id('dbo.Stu')
ORDER BY i.object_id, i.name
基本上,如果您发布的查询返回NULL索引名称,则表示您的表dbo.Stu上没有聚集索引。
我建议在表格上创建聚簇索引。
答案 2 :(得分:2)
以上答案的重要补充: 在两种情况下,sys.indexes目录视图中的索引名称可以为NULL:
1)如MSDN中所指定的,如果它实际上是一个堆,即表没有聚簇索引。对于每个nunclustered表,sys.indexes视图中都有一个这样的记录(即使表有其他非聚簇索引)。
2)如果这是一个统计数据(MSDN令人惊讶地保持沉默!)。至少,我在SQL 2008 R2服务器上的一个数据库中发现了这种情况。