这是一个奇怪的。我们有一个使用 EntityFramework 连接到 MS SQL Server 数据库 (SQL2010) 的 C# ASP.NET 网站应用程序。我们最近遇到了一个案例,应用程序中通常运行非常快(< 2 秒)的 LINQ 查询突然开始运行太久,以至于连接超时。数据库大小或从查询返回的数据量没有显着变化。此外,当我们在 SQL Mgmt Studio 中运行 SQL 版本的查询时,它运行正常(快速)。
这个问题没有发生在我们的开发或暂存数据库中,但是当我在 Visual Studio 中连接到 Prod DB 并在调试模式下运行代码时,我会在同一个查询中遇到超时。作为测试,我对 WHERE 语句做了一个小改动,它应该对查询逻辑没有影响(即:在末尾添加一行:'&& table.fieldname != "FOOBAR"')然后查询运行通常(快速)。当我从 WHERE 语句中删除多余的无用行并再次运行时,它又回到了超时状态(来回尝试了几次)。
DBA 尝试在 DB 上执行 DROPCLEANBUFFERS,但没有任何效果。无奈之下,我们重新启动了生产数据库服务器,这解决了问题(查询再次快速运行)。
我了解数据库服务器上的 EF 和 LINQ 缓存查询。基于上述情况,在我看来,这个查询的缓存版本以某种方式损坏了。我原以为 DROPCLEANBUFFERS 会修复它,但似乎还有其他东西保存了通过重新启动而不是 DROPCLEANBUFFERS 来清除/重置的查询信息。
有没有其他人遇到过这个问题?有没有办法防止它?除了重新启动之外,是否有更简单的方法来刷新缓存的 EF/LINQ 查询?
附带说明一下,在使用常规存储过程提取数据的早期非 EF/非 LINQ 版本的应用程序中,我们在同一个数据库中遇到了类似的问题。每隔一段时间(一年 2-3 次),通常在几秒钟内运行的 SP 之一会开始超时,但仅在从应用程序运行时才会开始。直接从 SQL Mgmt Studio 执行的同一 SP 仍将正常运行。修复它的唯一方法是完全删除并重新创建 SP。DBA 得出的结论是,数据库正在为同一个 SP 创建两个执行计划,这是问题的根源(尽管我们从未确切了解它发生的原因或如何防止它)。
任何帮助或建议将不胜感激!
萨斯科兹