ネットを荒らした多くの議論が私の問題の側面をカバーしていますが、ここに当てはまるパターンは見当たりません:
MySQL で EF 3.5 を使用する基本的な .NET WinForm アプリケーションがあります。アプリケーションはほとんどのクエリで正常に動作しますが、Distinct() を含むクエリは非常に遅くなるか、「操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません」というエラーが発生します。マシンの再起動後に最初に実行されたときに例外が発生します。つまり、アプリケーションを再起動すると、MySQL サービスを停止して再起動した後でも、Distinct() クエリは正常に機能します (つまり、1 秒もかかりません)。
アプリケーションを再実行したり、MySQL を再起動したりしても問題を再現できないという事実は、EF コンパイルまたは MySQL キャッシングが要因であることを除外します。再起動後にのみ、問題が再発します。おそらく.NETの初期化の問題か、OSに関連する何かだと思います。この問題は、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 シェルで実行すると、最初は約 30 秒かかり、その後は mysql を再起動した後でも約 1 秒かかります。再起動後、30 秒に戻ります。OS は最初は db ファイル全体を読み取っているように見えますが、その後はそうではありません (変更されたクエリ パラメータを使用しても、後続のクエリでの HD アクティビティはほとんどありません)。
OS の読み取りキャッシュをフラッシュして自分の理論をテストするにはどうすればよいですか?