我在网上搜索了很多相关讨论,但是我没有发现适用于我问题的模式:
我有一个基本的.NET WinForm应用程序,使用EF 3.5和MySQL。该应用程序在大多数查询中都能正常工作,但包含Distinct()的任何查询非常缓慢或会导致"The timeout period elapsed prior to completion of the operation or the server is not responding."异常,特别是在重新启动机器后第一次运行时,即使停止并重新启动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秒。在重启后又恢复到了30秒。看起来操作系统第一次读取整个数据库文件,但之后不再如此(即使使用修改后的查询参数,后续查询几乎没有硬盘活动)。我该如何清除操作系统的读缓存以测试我的理论?
Distinct()
让 DBMS 启动并缓存所有数据以执行某种表扫描,之后它就会留在内存中,因此速度很快。您可以拦截纯查询并在重新启动后执行它,以查看是否仍然存在缓慢的情况?然后,您可以更准确地确定问题的来源。 - CodeCaster