Here’s a great little script I found that lists indexes in the current database with no stats at all. That is, indexes that have never been read or even written to (since the last reboot, note). I’m not sure how much overhead these will have on the system – but it’s probably worth clearing them out anyway.
From the results I wouldn’t delete the ‘system’ indexes (that is ones starting with ‘MS~’ or ‘sys~’ and the like), or Clustered Indexes 🙂
I was about to work-up a script to delete them, then (phew) remembered … “dba-rule #23: never automate deletes”
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 --DROP INDEX [index-name] ON [dbo].[table-name]