执行超时已过期 - 随机用于简单更新命令

时间:2017-06-28 11:26:43

标签: sql asp.net entity-framework-6 timeout

我使用实体框架(EF6)随机获得执行超时过期错误。在执行以下更新命令时,它会给出随机执行超时错误。

  

UPDATE [dbo]。[EmployeeTable] SET [Name] = @ 0,[JoiningDate] = @ 1 WHERE   ([EMPID] = @ 2)

上述更新命令很简单,更新EmployeeTable需要2-5秒。但有时相同的更新查询需要40-50秒,并导致错误

  

执行超时已过期。超时时间过去之前   完成操作或服务器没有响应。该   声明已被终止

为此,我在 MyApplicationContext 类的构造函数中更新了我的代码,可以更改为包含以下属性

  

this.Database.CommandTimeout = 180;

上述命令应解决我的超时问题。但我无法找出问题的根本原因。

根据我的理解,这种类型的超时问题可能有三个原因;

  1. 某处出现僵局
  2. 数据库的统计信息和/或查询计划缓存不正确
  3. 查询过于复杂,需要调整
  4. 您能否告诉我该错误的主要根源是什么?

2 个答案:

答案 0 :(得分:0)

此查询:

UPDATE [dbo].[EmployeeTable]
    SET [Name] = @0,
        [JoiningDate] = @1
    WHERE ([EmpId]=@2);

通常不需要2秒钟。它(可能)正在更新单行,即使在相当大的表上,也不是2秒的操作。你有EmployeeTable(EmpId)的索引吗?如果没有,这将解释2秒以及死锁的可能性。

如果你有一个索引,这或许正在发生其他事情。一个值得关注的地方是桌面上的任何触发器。

答案 1 :(得分:0)

如果是随机的,则可能是您的应用程序在更新行时正在访问数据库。

我们遇到了同样的问题。在我们的案例中,根本原因是BO报告正在生产数据库上运行。这些报告锁定行并导致我们的应用程序超时(随机出现,因为这些报告是按需执行的。)

您可能要检查的其他事项:

  • 您的桌子上有复杂的触发器吗?
  • 表中使用的所有外键是否都在外表中建立了索引?