在SQL Server 2005中,我遇到了一个具有唯一ID列的表(上面有唯一索引)和主键聚簇索引(因此此列上有明确的2个索引)。这是此表上插入/更新/删除的主要性能因素吗?
我正在努力提高很久以前创建的数据库的性能,我想知道删除这些reduntant唯一索引是否有帮助。数据库是否在每次修改内容时检查/重建这两个索引?或者性能增益是否太小甚至无法解决这个问题?
以下是索引使用输出示例:
INDEX UserSeeks UserScans UserLookups UserUpdates
--------------------------------------------------------
1_PK 45517046 42911 245353 0
1_UQ 45517046 42911 245353 0
1_Other 45517046 42911 245353 0
--------------------------------------------------------
2_PK 21538111 5685 231030 1121
2_UQ 21538111 5685 231030 1121
3_other 21538111 5685 231030 1121
以下是我用来获取数据的查询:
SELECT OBJECT_NAME(I.OBJECT_ID) AS ObjectName,
I.NAME AS IndexName,
S.user_seeks AS UserSeeks,
S.user_scans AS UserScans,
S.user_lookups AS UserLookups,
S.user_updates AS UserUpdates
FROM sys.indexes I
JOIN sys.dm_db_index_usage_stats S
ON (S.OBJECT_ID = I.OBJECT_ID)
WHERE(database_id = DB_ID())
固定连接条件:
SELECT OBJECT_NAME(I.OBJECT_ID) AS ObjectName,
I.NAME AS IndexName,
S.user_seeks AS UserSeeks,
S.user_scans AS UserScans,
S.user_lookups AS UserLookups,
S.user_updates AS UserUpdates
FROM sys.indexes I
JOIN sys.dm_db_index_usage_stats S
ON (S.OBJECT_ID = I.OBJECT_ID)
AND(S.index_id = I.index_id)
WHERE(database_id = DB_ID())
答案 0 :(得分:4)
这可能不是一个多余的索引。
有一个非常窄的非聚集索引,它只包含ID
,可能已被作为一种有意识的策略,以使某些查询受益和/或使外键验证更有效。
我建议在这里回答(成功)resolve a deadlock problem OP的方法。
答案 1 :(得分:0)
索引通常会交换更新/插入/删除性能,以获得更好的选择性能。这几乎总是一件好事。
数据库是否在每个内容上检查/重建这两个索引 修改
它必须,或者索引已经过时,并返回错误的结果。
或者性能增益是否太小甚至不能打扰它?
这取决于桌子上的活动。
唯一约束还有一个功能:它使列保持唯一。由于没有索引就无法拥有唯一约束,因此在您的情况下删除它似乎不是一个选项。