SQL Server:索引利用率统计信息?

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

我知道从SQL Server 2005开始 ,可以根据Plan Cache中的内容获取使用顶级资源的查询的报告:

替代文字http://i38.tinypic.com/25jfi3o.png

我很想知道是否有任何索引不再使用,或很难使用,特别是多键索引。 可以想象, 查询计划caching还包含计划将使用的索引 ,所以也许在索引使用?

我终于设法在Google中find一个search词组,为我提供了SQL Server 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链接图像: 替代文字

我使用下面的脚本列出你未被充分利用的非聚集索引:

SELECT objectname = OBJECT_NAME(s.OBJECT_ID),indexname = i.name,i.index_id
,阅读= user_seeks + user_scans + user_lookups
,写= user_updates
,p.rows FROM sys.dm_db_index_usage_stats s JOIN sys.indexes i ON i.index_id = s.index_id AND s.OBJECT_ID = i.OBJECT_ID
JOIN sys.partitions p ON p.index_id = s.index_id AND s.OBJECT_ID = p.OBJECT_ID WHERE OBJECTPROPERTY(s.OBJECT_ID,'IsUserTable')= 1
AND s.database_id = DB_ID()
AND i.type_desc ='nonclustered'AND i.is_primary_key = 0 AND i.is_unique_constraint = 0 AND p.rows> 10000 ORDER BY reads,rows DESC

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

请注意,当SQL服务停止或数据库脱机时,底层DMV提供的计数将重置为零。 所以最好在SQL运行一段时间后运行这个脚本,并且计数已经build立起来了。

如果读取值为0,那么索引可能是安全的(除非不常用的应用程序逻辑需要)。