SQL Server:索引利用率统计?

SQL Server:索引利用率统计?

SQL Server 中有没有办法获取索引使用情况的报告?

我知道从SQL 服务器 2005,您可以获得顶级报告资源使用查询,基于计划缓存

替代文本

我很好奇,是否有一些索引不再使用或几乎不使用,尤其是多键索引。可以想象查询计划缓存还包含索引它将由计划使用,因此也许索引使用也在其中?

答案1

我终于找到了在 Google 中搜索短语这让我得到了答案SQL 服务器 2005和更新版本:

如何在 SQL Server 中获取索引使用信息(mssqltips.com):

SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
         I.[NAME] AS [INDEX NAME], 
         USER_SEEKS, 
         USER_SCANS, 
         USER_LOOKUPS, 
         USER_UPDATES 
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
         INNER JOIN SYS.INDEXES AS I 
           ON I.[OBJECT_ID] = S.[OBJECT_ID] 
              AND I.INDEX_ID = S.INDEX_ID 
WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 

得出的结果如下:

OBJECT_NAME          INDEX_NAME                 USER_SEEKS USER_SCANS USER_LOOKUPS USER_UPDATES
Properties           IX_Properties_PropertyName 0          455477     0            0
Locations_Depricated NULL                       0          71255      0            0
Users                PK__Users__UserIDInteger   137772     58637      47134        72
CurrencyTypes        PK_CurrencyTypes           3397       55554      0            0
ExchangeRates        IX_ExchangeRates           35736      46621      0            0
CurrencyCategories   IX_CurrencyCategories_1    0          25734      0            0
CurrencyCategories   IX_CurrencyCategories      0          22287      19888        0

或者,从 mssqltips 热链接图像: 替代文本

答案2

我使用以下脚本列出了未充分利用的非聚集索引:

选择对象名称 = OBJECT_NAME (s.OBJECT_ID),索引名称 = i.name,i.index_id
,读取 = user_seeks + user_scans + user_lookups
,写入 = user_updates
,p.rows 来自 sys.dm_db_index_usage_stats s JOIN sys.indexes i ON i.index_id = s.index_id 和 s.OBJECT_ID = i.OBJECT_ID
JOIN sys.partitions p ON p.index_id = s.index_id 和 s.OBJECT_ID = p.OBJECT_ID WHERE OBJECTPROPERTY (s.OBJECT_ID,'IsUserTable') = 1
和 s.database_id = DB_ID()
和 i.type_desc = 'nonclustered' 和 i.is_primary_key = 0 和 i.is_unique_constraint = 0 AND p.rows > 10000 ORDER BY 读数,行数降序

该脚本排除了也用于主约束或唯一约束的非聚集索引(并忽略少于 10000 行的索引)。

请注意,当 SQL 服务停止或数据库脱机时,底层 DMV 提供的计数将重置为零。因此,最好在 SQL 运行一段时间并且计数已累积时运行此脚本。

如果读取次数为 0,那么索引可能可以安全删除(除非不经常使用的应用程序逻辑需要它)。

相关内容