如何收集索引使用信息

nam*_*nam 3 index sql-server azure-sql-managed-instance query-performance performance-tuning

以下查询正确输出搜索、扫描等的数量。我对理解输出中的某些行有疑问。在查询的某些输出行中,索引名称显示为、NULL、、0;而在同一行中,它显示了和/或 的一些非零数字。问题:我们如何解释这些行?index_typeHEAPNumOfSeeksNumOfScansNumOfLookups

备注:所有表都没有聚集索引,因此所有表都是 HEAP。但在以下查询的输出的大多数行中,索引名称都显示(并且不显示为 NULL),并且 index_type 也显示(作为 NONSLUSTER)。因此,问题特定于此评论上面描述的输出行。

参考:sys.dm_db_index_usage_stats

SELECT OBJECT_NAME(IX.OBJECT_ID) Table_Name
       ,IX.name AS Index_Name
       ,IX.type_desc Index_Type
       ,SUM(PS.[used_page_count]) * 8 IndexSizeKB
       ,IXUS.user_seeks AS NumOfSeeks
       ,IXUS.user_scans AS NumOfScans
       ,IXUS.user_lookups AS NumOfLookups
       ,IXUS.user_updates AS NumOfUpdates
       ,IXUS.last_user_seek AS LastSeek
       ,IXUS.last_user_scan AS LastScan
       ,IXUS.last_user_lookup AS LastLookup
       ,IXUS.last_user_update AS LastUpdate
FROM sys.indexes IX
INNER JOIN sys.dm_db_index_usage_stats IXUS ON IXUS.index_id = IX.index_id AND IXUS.OBJECT_ID = IX.OBJECT_ID
INNER JOIN sys.dm_db_partition_stats PS on PS.object_id=IX.object_id
WHERE OBJECTPROPERTY(IX.OBJECT_ID,'IsUserTable') = 1
GROUP BY OBJECT_NAME(IX.OBJECT_ID) ,IX.name ,IX.type_desc ,IXUS.user_seeks ,IXUS.user_scans ,IXUS.user_lookups,IXUS.user_updates ,IXUS.last_user_seek ,IXUS.last_user_scan ,IXUS.last_user_lookup ,IXUS.last_user_update
Run Code Online (Sandbox Code Playgroud)

Eri*_*ing 6

堆是 SQL Server 中没有聚集索引的基表的名称。您可以自由地在堆上创建非聚集索引。

堆没有名称,sys.indexes因为它们不是索引。描述堆的最常见方式是无序页。索引是按索引键中的列逻辑排序的页。

您可以连接回sys.tables并使用ISNULL堆的基表名称替换索引名称。

虽然在某些边缘情况下您可以在没有索引的情况下进行查找,但行是通过内部标识符在堆中标识的,该内部标识符不容易向用户公开,或者在通常编写的查询中用作可查找谓词。