在我的SQL Server 2008 Enterprise中,我有一个包含多个表的数据库:
Departments
- 几行Persons
- 300 + - 行Permissions
- 数千行 Persons
的主键是PersonId
与DepartmentId
(FK本身)相结合。
Permissions
表有一个FK,具有对Persons
表的PK的级联功能(删除,更新)。
执行此声明时:
UPDATE Persons SET PersonId = PersonId + 1 WHERE DepartmentId = 789
使用SSMS,ADO,ADO.NET我要么超时,要么花费太长时间(超过10分钟)。
我尝试使用ADO.NET逐个更新行,并发现这种奇怪的行为:当我到达特定行时,更新开始挂起。我尝试重新启动,删除和创建,备份和恢复,删除行并重新插入但尚未解决它。
提前感谢您的回答。 母鸡
答案 0 :(得分:2)
通过使用适当的索引,几乎所有过度阻塞的实例都可以修复(或至少管理)。
此外,您应确保重建索引并更新统计信息(至少)。
您的聚簇索引是在复合主键(PersonId,DepartmentId)上定义的吗?
有几种方法可以确定阻止哪个进程。其中一个是sp_who2
。在BlkBy
列中查找条目。
另见:How To Find The Table Names Which Are Locked (Specific to any transaction)
答案 1 :(得分:2)
如果已经添加了索引(当然手动添加了它们,它们不会自动添加FK),那么另一个主要元凶就是触发器。
检查相关表格的触发器。
答案 2 :(得分:1)
已经很长时间了,但这是确定的问题: 其中一个依赖项(通过FK依赖项)由视图引用,该视图是模式绑定的。视图必须保持模式绑定,因为它是全文索引的。
解决方案正在删除并重新创建视图和fts索引。 (任何其他想法将不胜感激)
答案 3 :(得分:0)
运行sp_who2并查看正在发生的块(如果有)。如果没有,请考虑像gdn建议查看你是否有任何触发器可能导致过多的时间进行finsih射击。
答案 4 :(得分:-1)
重启数据库服务器后,尝试使用SQL Server管理工具执行相同的查询。如果它在那里工作正常,那么你可能会遇到一些锁定问题。
尝试在DepartmentId上创建索引。
编辑:
如果出现性能问题,请考虑在Permissions
PersonId
以及Persons DepartmentId索引之外创建索引。