创建索引的目的是为了加快查询速度,但是任何事情都是过犹不及的。
如果建的索引太多,反而会降低性能。
(1)多少索引算多?
先说个真实的事。
前几年的时候,有一次写一个简单的sql,觉得查的很慢,想想是不是少了索引。
于是打开ssms客户端,点开表下面的索引,发现这个表尽然有100多个索引,当时就懵了。。。
这100多个索引,实在是太多了,同时也说明这个数据库没有DBA管理,很混乱,这个可能是更大的问题。
一般情况下,一个表的索引,个人觉得5个左右,这个具体的数量,可以进行实际的测试,如果索引多了,觉得插入慢,可以减少,或者合并索引。
(2)通过监控,删除不用的多余索引
删除只有user_updates的,但user_seeks为0的。
select
DB_NAME(d.database_id),
OBJECT_NAME(d.object_id),
,
user_seeks,
user_scans,
user_lookups,
user_updates --通过用户查询执行的更新次数
from sys.dm_db_index_usage_stats d
inner join i
on d.object_id = i.object_id
and d.index_id = i.index_id
where database_id = DB_ID('数据库名')
(3)找到低效索引
找到user_updates比较大,而user_seek、user_scan很小的索引,分析一下为什么有维护的开销,而实际索引使用次数较少,是不是索引建的不合理,其中的字段顺序、个数都不对。