我花了一些时间研究这个并且根本找不到确定的答案。这是我用来查找未使用的索引的查询:
SELECT object_name(i.object_id) as tableName, i.name as indexName
FROM sys.indexes i
LEFT JOIN sys.dm_db_index_usage_stats s ON i.object_id = s.object_id AND i.index_id = s.index_id AND s.database_id = db_id()
WHERE objectproperty(i.object_id,'IsUserTable') = 1 and i.index_id> 0
AND s.object_id IS NULL
AND i.is_Primary_Key = 0
AND i.is_unique_constraint = 0
AND i.is_unique = 0
我的理解是,自上次重新启动sql server以来,查询优化器尚未使用此查询返回的索引。我相信我应该删除它们......我只是不完全了解离开它们是否存在性能影响或伤害。
答案 0 :(得分:7)
留下它们的危害在于INSERT
,UPDATE
和DELETE
语句的使用空间和增加的工作,因为它们必须保持索引以及基表的更新
答案 1 :(得分:5)
将它们留在那里会产生性能影响;为每个插入,更新或删除表维护索引。
另一方面,您怎么知道索引没有被使用? DMV很棒,但它只涵盖自上次重启SQL Server以来的时间。因此,如果DMV没有完整商业周期的数据,您可能会在下次运行时杀死首席执行官的年度报告。
以我的拙见:永远不要只根据使用DMV中的信息删除索引。