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