質問: Mapper.Map>(page); return Page(dtoPage, count); ``` したがって、コードは例外的に何もしません - `IN`句などを使用せず、単純なフィルタ、ソート、ページングを行います。 **問題:**このメソッドを呼び出すと、実行時間が不安定になります。私は単純なスクリプトを使用して、このコードをさまざまなパラメータで呼び出すAPIエンドポイントを呼び出しました。各コール(最初のコールを除く)では、コールに300ミリ秒以下の時間がかかります。 **しかし** 、全体的な呼び出しが1200回だったので、36回の呼び出し時間が1秒を超えました。この時間中に再度クエリが再コンパイルされたようです。通話の平均時間は**250ms**でしたが、時には1000msに達しました。これは4倍の差です。 テストの一般的な動作は次のとおりです。 1. 最初のクエリが遅い 2. 2番目のクエリは高速ですが、まだ遅い 3. 残りのクエリは非常に安定しています。 誰も私以外のテスト環境を使用していないので、負荷の問題ではありません。高速なローカルPC(i5 + 8GBのRAM + SSD)であっても、どんな環境でも再現できます。 また、テスト間のわずかな遅延 - ですから私の質問は簡単です: **この問題**は**何から来ていますか?** 1. これは本当に再コンパイルの問題ですか、そうでない場合は、問題の原因は何ですか? 2. Entity Framework 6のクエリキャッシュの無効化に関するドキュメントはありますか? 3. より長い時間キャッシュにクエリを保持する方法があるので、今すぐメソッドをクエリして30分後に再コンパイルする必要はありませんか?
回答: > これは本当に再コンパイルの問題ですか? > > 私はそれが再コンパイルの問題だとは思わない。しかし、 `Skip` and `Take`コールでラムダを渡すことで、再コンパイルを軽減できます。 4.2定数を使ったクエリを生成する関数の使用を参照してください。 > もしそうでなければ、問題の起源は? > > AFAIK SqlAzureは共有環境です。それはあなたの問題の原因かもしれません。 > Entity Framework 6のクエリキャッシュの無効化に関するドキュメントはありますか?より長い時間キャッシュにクエリを保持する方法があるので、今すぐメソッドをクエリして30分後に再コンパイルする必要はありませんか? > > サーバーがメモリを必要としない限り、AppDomain、SQLクエリプランはSQL Serverメモリにとどまる限り、Entity Frameworkクエリはメモリ内に残ります。ラムダの`Skip`と`Take`もその点で助けになるでしょう。同じページを参照してください: > > ``` > "In EF6 these methods have a lambda overload that effectively makes the > cached query plan reusable because EF can capture variables passed to > these methods and translate them to SQLparameters. This also helps > keep the cache cleaner since otherwise each query with a different > constant for Skip and Take would get its own query plan cache entry" > > ``` >