SQL Server 2008更新语句挂起

时间:2011-12-11 09:01:11

标签: sql-server-2008 sql-update hang foreign-keys

在我的SQL Server 2008 Enterprise中,我有一个包含多个表的数据库:

  1. Departments - 几行
  2. Persons - 300 + - 行
  3. Permissions - 数千行
  4. Persons的主键是PersonIdDepartmentId(FK本身)相结合。

    Permissions表有一个FK,具有对Persons表的PK的级联功能(删除,更新)。

    执行此声明时:

    UPDATE Persons SET PersonId = PersonId + 1 WHERE DepartmentId = 789
    

    使用SSMS,ADO,ADO.NET我要么超时,要么花费太长时间(超过10分钟)。

    我尝试使用ADO.NET逐个更新行,并发现这种奇怪的行为:当我到达特定行时,更新开始挂起。我尝试重新启动,删除和创建,备份和恢复,删除行并重新插入但尚未解决它。

    提前感谢您的回答。 母鸡

5 个答案:

答案 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索引之外创建索引。