Sql server 2008 SQL Server 2008更新语句挂起

Sql server 2008 SQL Server 2008更新语句挂起,sql-server-2008,sql-update,freeze,foreign-keys,Sql Server 2008,Sql Update,Freeze,Foreign Keys,在我的SQL Server 2008 Enterprise中,我有一个包含多个表的数据库: 部门-几行 人员-a 300+行 权限-数千行 Persons的主键是与DepartmentId组合的PersonId(它本身就是一个FK) Permissions表有一个FK,该FK具有级联功能(删除、更新)到Persons表的PK 当我执行此语句时: UPDATE Persons SET PersonId = PersonId + 1 WHERE DepartmentId = 789 使用SSMS、

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

  • 部门
    -几行
  • 人员
    -a 300+行
  • 权限
    -数千行
  • Persons
    的主键是与
    DepartmentId
    组合的
    PersonId
    (它本身就是一个FK)

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

    当我执行此语句时:

    UPDATE Persons SET PersonId = PersonId + 1 WHERE DepartmentId = 789
    
    使用SSMS、ADO、ADO.NET,我要么超时,要么超时时间太长(超过10分钟)

    我试着用ADO.NET一行一行地更新这些行,发现了这种奇怪的行为:当我到达一个特定的行时,更新开始挂起。我尝试重新启动、删除和创建、备份和恢复、删除行并重新插入,但还没有解决

    提前感谢您的回答。
    当重新启动数据库服务器后,请尝试使用SQL Server管理工具执行相同的查询。如果它在那里工作正常,那么您可能有一些锁定问题

    还可以尝试在DepartmentId上创建索引

    编辑:
    如果它的性能问题考虑在<代码>权限> <代码> >代码>人物> /代码>,除了个人部门索引之外,

    几乎所有的过阻塞实例都可以使用适当的索引来固定(或至少管理)。p> 此外,您应该确保重建索引并更新统计信息(至少)

    您的聚集索引是在复合主键(PersonId、DepartmentId)上定义的吗

    有几种方法可以识别哪个进程被阻塞。其中之一是
    sp_who2
    。在
    BlkBy
    列中查找条目


    另请参见:

    如果添加了索引(当然,它们不是用FKs自动添加的),那么另一个主要原因是触发器触发


    检查相关表上的触发器。

    运行sp_who2,查看出现了哪些块(如果有)。如果没有GDND的建议,如果你有任何触发可能会导致大量的时间被解雇。

    < P>这已经是很长时间了,但是这里的问题是: 其中一个依赖项(通过FK依赖项)由一个绑定到模式的视图引用。视图必须保持架构绑定,因为它正在被全文索引

    解决方案是删除并重新创建视图和fts索引。
    (任何其他想法将不胜感激)

    “重新启动数据库服务器后”-说什么?这不是好建议@Mitch Wheat在重新启动数据库服务器后,服务器上不应该有任何可能锁定表的正在运行的事务。如果他必须检查应用程序正在做什么或者查询是否有问题,那么直接运行查询而不使用任何应用程序逻辑应该会给他一个线索。但是,确保没有其他连接就足够了。外键不会自动创建index@Udo:重新启动服务器不应仅仅因为锁定被保留!这是一个非常糟糕的建议。@Mitch Wheat如果他“尝试过重新启动、删除和创建、备份和恢复、删除行并重新插入”,那么他可能有自己的实例。。。。根据他的知识,他可以更容易地重新启动服务器,而不是终止所有其他事务。我们通常不会重新启动服务器进行此类测试…您有什么类型的索引?
    Persons
    上的
    部门ID
    是否已编制索引??您的数据库中是否同时发生了其他事情,例如,当您尝试更新
    Persons
    表时,是否有其他人正在修改或查询该表?请发布所有相关表的架构和索引定义。