如何在死锁中避免非唯一的Clustered索引

时间:2017-01-25 12:35:30

标签: sql indexing sql-server-2012 database-deadlocks

我有没有主键的表。但它在4列上有非唯一的聚簇索引。在更新表中的一个非键列时,我们看到此索引是死锁的一部分。 我们怎能避免这种情况?创建具有5列的主键或添加标识列是否更好?我们可能还需要创建非聚集索引,以便在删除现有聚簇索引后提高性能。

1 个答案:

答案 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期间创建它们   维护窗口。请务必分别调整每个查询。

我知道这并没有“回答”问题为什么必然,但它确实表明添加索引可以改变执行方式,使锁占用空间更小或执行时间更快,这可以显着降低死锁。

https://stackoverflow.com/a/10738827/7462678