Pourquoi la table sys.indexes a-t-elle un nom d'index NULL?

J'ai couru cette requête:

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 

et l'index le plus grand renvoyé avait un nom NULL. Qu'est-ce que ça veut dire?

De sys.indexes :

Nom de l'index …
NULL = tas

Donc, ce sont des tas.

La vue sys.indexes affiche non seulement les index, mais également les tables qui n'ont pas d'index. De telles tables sont appelées tas. Dans ce cas, il n'y a pas de nom de l'index. Cela peut être trompeur, je suis d'accord.

 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 

Fondamentalement, si la requête que vous avez publiée renvoie un nom d'index NULL, cela signifie qu'il n'y a pas d'index clusterisé sur votre table dbo.Stu.

Je recommand de créer un index cluster sur la table.

L'ajout d'Imortant aux réponses ci-dessus: Le nom de l'index dans la vue de catalogue sys.indexes peut être NULL dans DEUX cas:

1) Comme spécifié dans MSDN, s'il s'agit d'un tas, c'est-à-dire que la table n'a pas d'index clusterisé. Pour chaque table nunclustered, il existe un tel logging dans la vue sys.indexes (même si la table a d'autres index non clusterisés).

2) S'il s'agit d'une statistique (MSDN garde étonnamment le silence à ce sujet!). Au less, j'ai observé une telle condition sur une de mes bases de données sous SQL Server 2008 R2.