1

以下のラムダにのみ渡すcreatedFromDateと、クエリは約 300 ミリ秒で終了しました。しかし、パラメータを渡すとid、約 20 ~ 30 秒で終了します。id変数を渡すときにクエリを改善する方法はありますか?

List<MYENTITY> list= ctx.MYENTITY.Where(s => 
      (string.IsNullOrEmpty(createdFrom) || s.CREATE_DATE >= createdFrom) && 
      (string.IsNullOrEmpty(id) || s.ANOTHER_ENTITY.FirstOrDefault().ID == id)
      .ToList();
4

3 に答える 3

1

これはEFのせいではないと思います。私が行うことは、EFによって生成されているクエリをキャプチャし、それをSSMSに貼り付けて、クエリプランを確認することです。私の推測では、インデックスが欠落しているため、テーブルまたはインデックスのスキャンが実行されています。または、インデックスは存在しますが、使用されていません。おそらく、1つ以上の列をインデックスに含める必要があるためです。

于 2012-12-03T13:15:17.673 に答える
1

試してみる簡単なこと:

List<MYENTITY> list = ctx.MYENTITY.Where(s => 
  string.IsNullOrEmpty(createdFrom) || s.CREATE_DATE >= createdFrom)
  .ToList()
  .Where(s2 => string.IsNullOrEmpty(id) || s2.ANOTHER_ENTITY.FirstOrDefault().ID == id)
  .ToList();

これは解決策ではありませんが、速度が向上する場合はコードを確認することをお勧めします。速度が変わらない場合は、データベース構造を確認することをお勧めします。

于 2012-12-03T13:18:38.310 に答える
1

次の評価済み ID を取得できません:

s.ANOTHER_ENTITY.FirstOrDefault().ID

つまりint?anotherEntityId = s.ANOTHER_ENTITY.FirstOrDefault().ID;

上記のコード行の代わりにそれを使用します。

where句にそれを含めると、(このエンティティを取得するために使用されるefクエリに応じて)かなりの可能性があり、最終的なSQLクエリがめちゃくちゃになると思います。

少なくとも、テストする価値はあると思います。

つまり、anotherEntityId を既知の値に置き換えてテストできます。遅い場合は、次の評価です。

s.ANOTHER_ENTITY.FirstOrDefault().ID

それが本当の問題です。

于 2012-12-03T13:25:07.640 に答える