每个索引都是分开的 - 没有交叉引用等等。所以是的,如果这些指标是重复的,你最终可能会浪费一些时间。但是:在多个索引中包含单个列是完全有意义的 - 像复合索引(几个字段)等事物可能是并排存在的。
SQL Server作为2005年有一个非常不错的功能叫做DMV(动态管理视图),它允许你检查
- 并不是在所有的
- 失踪指数可能会加快使用索引你的查询负载
寻找失踪指数:
SELECT
object_name(object_id), d.*, s.*
FROM
sys.dm_db_missing_index_details d
INNER JOIN
sys.dm_db_missing_index_groups g ON d.index_handle = g.index_handle
INNER JOIN
sys.dm_db_missing_index_group_stats s ON g.index_group_handle = s.group_handle
WHERE
database_id = db_id()
ORDER BY
object_id
查找未使用的索引:
DECLARE @dbid INT
SELECT @dbid = DB_ID(DB_NAME())
SELECT
OBJECTNAME = OBJECT_NAME(I.OBJECT_ID),
INDEXNAME = I.NAME,
I.INDEX_ID
FROM
SYS.INDEXES I
JOIN
SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID
WHERE
OBJECTPROPERTY(O.OBJECT_ID, 'IsUserTable') = 1
AND I.INDEX_ID NOT IN (SELECT S.INDEX_ID
FROM SYS.DM_DB_INDEX_USAGE_STATS S
WHERE S.OBJECT_ID = I.OBJECT_ID
AND I.INDEX_ID = S.INDEX_ID
AND DATABASE_ID = @dbid)
ORDER BY
OBJECTNAME, I.INDEX_ID, INDEXNAME ASC
只需注意:具有特定顺序的复合索引确实会提高围绕该顺序构建的查询的性能。通过使用索引扫描与索引查找之间的折衷,创建索引会简化一些事情,这些索引扫描速度要快得多。 ORDER BY将利用索引(如果存在)。 – 2010-02-17 23:37:43