【问题标题】:Do I need a maintenance plan to prevent a known SQL Server timeout from happening in the future?我是否需要维护计划来防止将来发生已知的 SQL Server 超时?
【发布时间】:2018-05-02 16:52:48
【问题描述】:

我们的 C#/LINQ to EF 代码中有一个查询,该查询在通过我们的 Web 应用程序 (ASP.NET MVC) 运行时始终导致超时。

错误信息:

执行超时已过期。
在操作完成之前超时时间已过或服务器没有响应。

直接在 SSMS 中运行由 LINQ 生成的 SQL 几乎是瞬时的,无论返回或查询的数据大小如何(我们在查询中使用日期范围)。

This answer 解决了超时问题:我们跑了

exec sp_updatestats 

在数据库上,现在不再发生超时。

但是,正如 cmets 中提到的,这是否解决了实际问题?

它是否可以防止问题在未来发生?

  1. 由于查询没有导致直接在 SSMS 中运行的任何问题,这是否表明 ASP.NET / EF 存在问题?

  2. 或者维护计划是正确的方法?我对维护计划一无所知。我看到问题about rebuilding indices、备份等。如果我需要维护计划来防止将来发生此超时问题,我必须设置哪种类型的计划?

【问题讨论】:

  • 回答:没有。在我作为许多不同平台上的开发人员的漫长职业生涯中,我了解到您永远不应该通过更改设置/配置等来解决超时问题。唯一安全的事情是:减少您在一次调用中尝试完成的工作量。
  • @GertArnold 我想听听更多,为什么不呢?在我的情况下,我每天凌晨 2:00 运行更新所有统计信息 sp_updatestats 的工作,有时需要 1 小时才能完成,但第二天所有用户都很满意,数据库大小(30GB +)
  • @GertArnold - 感谢您的洞察力。我可以使用什么方法来优化我的查询 - 或减少我在其中所做的工作量?有问题的查询并不比我们经常做的其他事情复杂。仅当我们在特定日期范围内查询数据时才会发生超时。具有不同日期范围的相同查询不会产生超时。我们如何处理这些信息?
  • @Monah 当然,每个数据库都需要维护计划(统计、索引碎片整理/重建)。我们将答案中提到的相同脚本应用于客户的数据库。但这是为了防止在内置机制不够用时逐渐退化(他们很难做到)。这不是与不断重复的超时作斗争。然后是从根本上解决问题的时候了:减少任务规模、改进索引和/或查询、重组数据,或者,作为最后的手段,购买更好的硬件。
  • @Winks 在不知道数据的情况下很难判断。也许某些日期范围会导致在表格的物理分散部分进行搜索。您可能需要重新评估其聚集索引:use-the-index-luke.com/blog/2014-01/…

标签: c# asp.net sql-server linq maintenance-plan


【解决方案1】:

我首先要提到的是,包括更新统计信息和/或索引重组在内的定期数据库维护是一种最佳做法。这可以通过维护计划、流行的Ola Hallengren's SQL Server Maintenance Solution 或您自己的脚本来实现。 Ola 的解决方案根据阈值有选择地执行维护以避免不必要的开销。SQL Server 使用基于成本的优化器,因此从统计数据中收集的更准确的行数估计将有助于提供最佳的执行计划。

SSMS 和应用代码之间显着不同的查询性能表明不同的执行计划。至于为什么同一查询的计划可能不同,我建议您仔细阅读 Erland Sommarskog 的文章Slow in the Application, Fast in SSMS 了解详细信息。不同计划的常见原因包括文章中详述的不同会话 SET 选项或参数嗅探。另外,请注意,您需要使用参数化的sp_executesql 查询来执行 SSMS 查询,以更好地模拟 EF 执行的参数化查询。 SSMS 中的局部变量或字面量与参数不是一回事,可能会导致不同的计划。

当您运行 sp_updatestats 时,它不仅会更新统计信息,还会使缓存的执行计划无效,因此它可以解决参数嗅探和过时的统计信息。单独的DBCC FREEPROCCACHE 将解决参数嗅探,这应该针对生产 OLTP 环境中的问题计划。

【讨论】:

  • 这正是我正在寻找的信息,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多