簡體   English   中英

EF查詢性能問題

[英]EF query performance issues

如果我只將createdFromDate傳遞給下面的lambda,我的查詢在大約300ms完成。 但是如果我傳遞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();

我懷疑這不是EF的錯。 我要做的是捕獲EF生成的查詢,將其粘貼到SSMS中並查看查詢計划。 我的猜測是正在進行表或索引掃描,因為缺少索引。 或者,索引存在但未被使用,可能是因為索引中應包含一個或多個列。

一個簡單的嘗試:

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();

這不是一個解決方案,但如果它加快了速度,那么我建議查看你的代碼,如果速度保持不變,我建議你查看你的數據庫結構。

你能不能得到以下評估的ID:

s.ANOTHER_ENTITY.FirstOrDefault().ID

即int? anotherEntityId = s.ANOTHER_ENTITY.FirstOrDefault()。ID;

並使用它代替上面的代碼行。

我認為在where子句中包含它實際上很可能(取決於用於獲取此實體的ef查詢)導致最終的sql查詢成為一團糟。

至少我認為值得測試。

也就是說你可以將anotherEntityId替換為某個已知值並進行測試,如果它很慢那么就是它的評估

s.ANOTHER_ENTITY.FirstOrDefault().ID

這才是真正的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM