为什么sys.indexes表具有NULL索引名称?

时间:2010-02-12 00:29:26

标签: sql-server sql-server-2005

我运行了这个查询:

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名称。这是什么意思?

3 个答案:

答案 0 :(得分:11)

来自sys.indexes

  

索引名称...
  NULL =堆

所以这些都是堆。

答案 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服务器上的一个数据库中发现了这种情况。