每個索引都是分開的 - 沒有交叉引用等等。所以是的,如果這些指標是重複的,你最終可能會浪費一些時間。但是:在多個索引中包含單個列是完全有意義的 - 像複合索引(幾個字段)等事物可能是並排存在的。
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