[英]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.