在网上进行了许多讨论,涵盖了我的问题的各个方面,但我看不到适用于此的模式:
我有一个使用 EF 3.5 和 MySQL 的基本 .NET WinForm 应用程序。该应用程序适用于大多数查询,但任何包含 Distinct() 的查询都非常慢或导致“在操作完成之前超时时间已过或服务器没有响应”。机器重启后第一次运行时出现异常。即,当重新启动应用程序时,即使在停止并重新启动 MySQL 服务之后,Distinct() 查询从现在开始也可以正常工作(即不到 1 秒)。
我无法通过重新运行应用程序或重新启动 MySQL 来重现问题的事实排除了 EF 编译或 MySQL 缓存是一个因素。只有重新启动后问题再次出现。让我觉得这可能是 .NET 初始化问题或与操作系统相关的其他问题。该问题已在 XP 和 Win 7 上观察到。
任何想法表示赞赏。(还有尝试在不重新启动机器的情况下重现问题的想法,这是非常不切实际的:-)
更新:
EF 生成的查询如下所示:
SELECT Distinct1.C2 FROM (
SELECT DISTINCT YEAR(Extent1.RecDate) AS C2
FROM dailyrecord AS Extent1
WHERE (Extent1.STN = 430030) AND (Extent1.WBAN = 99999)
) AS Distinct1;
第一次在 mysql shell 中运行大约需要 30 秒,即使在重新启动 mysql 之后,所有后续时间也大约需要 1 秒。重启后回到30s。看起来操作系统第一次读取整个 db 文件,但此后没有(后续查询的 HD 活动很少,即使修改了查询参数)。
如何刷新操作系统的读取缓存以测试我的理论?