我们在ASP.NET Core应用程序中使用EF Core 1.1,其中以下LINQ查询首次执行时大约需要45秒到一分钟。第一次执行后,后续执行似乎工作正常。
问题:我们如何改善此查询的性能。等待大约45秒或更长时间的用户会给他/她留下一个印象,即显示查询的ASP.NET页面可能已损坏,用户会移动到另一页面:
var lstProjects = _context.Projects.Where(p => p.ProjectYear == FY && p.User == User_Name).OrderBy(p => p.ProjectNumber).ToList();
SQL Server查询编辑器中的执行计划:该表有24列,其中一列的类型为varchar(255),其中四列的类型为varchar(75)。其他类型有int,smalldatetime,bit等类型。查询中需要所有列。但是WHERE
子句过滤数据以返回大约26,000个中的约35行。
有关执行计划的更多详情
答案 0 :(得分:1)
更新了评论以回答。
使用Code First时,仍需要考虑基于在应用程序的高流量区域中运行的常见查询进行索引。跨PK的索引扫描只比表扫描多一点,因此项目年+用户名的索引会提高性能,如果预计会稍微使用或性能敏感,则应予以考虑。无论是DB First还是Code First,开发人员都需要针对数据库考虑分析器结果,以便根据实际使用情况优化索引。通常,执行计划将返回索引建议。索引建议应出现在执行计划中的SQL语句下方。从屏幕截图中可以清楚是否有人建议,因为在弹出统计数据下可能有一个位于SQL右侧的滚动条。
如果查询返回结果缓慢但没有建议,请尝试使用执行计划重新运行带有更改参数的查询,以排除SQL拾取预编译查询。