我有没有主键的表。但它在4列上有非唯一的聚簇索引。在更新表中的一个非键列时,我们看到此索引是死锁的一部分。 我们怎能避免这种情况?创建具有5列的主键或添加标识列是否更好?我们可能还需要创建非聚集索引,以便在删除现有聚簇索引后提高性能。
答案 0 :(得分:1)
死锁解决的最佳资源(仍然)在这里:http://blogs.msdn.com/b/bartd/archive/2006/09/09/deadlock-troubleshooting_2c00_-part-1.aspx。
Pt#4说:
通过数据库调优运行死锁中涉及的查询 顾问。在Management Studio查询窗口中跳过查询,进行更改 db上下文到正确的数据库,右键单击查询文本和 选择“在DTA中分析查询”。不要跳过这一步;超过一半 我们看到的死锁问题只需添加一个即可解决 适当的索引,以便其中一个查询运行得更快 锁定占地面积较小。如果DTA建议索引(它会说 “估计改进:%”),创建并监控 看看死锁是否仍然存在。您可以选择“应用建议” 从Action下拉菜单中立即创建索引,或 将CREATE INDEX命令保存为脚本以在a期间创建它们 维护窗口。请务必分别调整每个查询。
我知道这并没有“回答”问题为什么必然,但它确实表明添加索引可以改变执行方式,使锁占用空间更小或执行时间更快,这可以显着降低死锁。