我是否需要维护计划来防止将来发生已知的 SQL 服务器超时?

Do I need a maintenance plan to prevent a known SQL Server timeout from happening in the future?

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

错误信息:

Execution Timeout Expired.
The timeout period elapsed prior to completion of the operation or the server is not responding.

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

This answer 解决超时问题:我们运行

exec sp_updatestats 

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

但是,正如评论中所说,这是否解决了实际问题?

它能防止问题在未来发生吗?

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

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

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

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

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