当同一列上存在PK和UQ索引时,SQL Server中的性能

时间:2012-10-25 15:55:17

标签: sql-server indexing

在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())

2 个答案:

答案 0 :(得分:4)

这可能不是一个多余的索引。

有一个非常窄的非聚集索引,它只包含ID,可能已被作为一种有意识的策略,以使某些查询受益和/或使外键验证更有效。

我建议在这里回答(成功)resolve a deadlock problem OP的方法。

答案 1 :(得分:0)

索引通常会交换更新/插入/删除性能,以获得更好的选择性能。这几乎总是一件好事。

  

数据库是否在每个内容上检查/重建这两个索引   修改

它必须,或者索引已经过时,并返回错误的结果。

  

或者性能增益是否太小甚至不能打扰它?

这取决于桌子上的活动。

唯一约束还有一个功能:它使列保持唯一。由于没有索引就无法拥有唯一约束,因此在您的情况下删除它似乎不是一个选项。