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,那么索引可能是安全的(除非不常用的应用程序逻辑需要)。