代码之家  ›  专栏  ›  技术社区  ›  Abe Miessler

为什么sys.indexes表的索引名为空?

  •  5
  • Abe Miessler  · 技术社区  · 15 年前

    我运行了此查询:

    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
    

    返回的最大索引的名称为空。这是什么意思?

    3 回复  |  直到 10 年前
        1
  •  11
  •   Remus Rusanu    15 年前

    sys.indexes :

    索引的名称…
    NULL =堆

    所以这些都是堆。

        2
  •  5
  •   Piotr Rodak    15 年前

    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
    

    基本上,如果您发布的查询返回空索引名,则表示表dbo.stu上没有聚集索引。

    我建议在表上创建聚集索引。

        3
  •  2
  •   Denys Avilov    10 年前

    以上答案的重要补充: sys.indexes目录视图中的索引名称在两种情况下可以为空:

    1)根据msdn中的规定,如果它实际上是堆,即表没有聚集索引。对于每个未聚集的表,在sys.indexes视图中都有一个这样的记录(即使表有其他非聚集索引)。

    2)如果这是一个统计数据(msdn出人意料地保持沉默!)。至少,我在SQL 2008 R2服务器下的一个数据库中观察到了这种情况。