我在ASP.NET MVC操作方法中有以下简单查询。
IEnumerable<Company> query = unitOfWork.CompanyRepository.dbSet
.Include("Adresses.PhoneNumbers")
.Include("Adresses.FaxNumber")
.Include("Emails").Where(q => q.CustomerCompany == true);
此操作方法通过ajax get请求调用,有时最多需要25秒!数据库中只有40家公司。每个公司都有单一的地址,最多只有几个PhoneNumbers和FaxNumbers。(有趣的是它有时需要200-500毫秒,但非常罕见)
如果我将此查询更改为以下
IEnumerable<Company> query = unitOfWork.CompanyRepository.dbSet
.Where(q => q.CustomerCompany == true);
它只需要大约200毫秒。
所以我想知道为什么.Include
如此昂贵。我的应用程序正在生产中,我正在使用SQL Azure和Azure网站。
感谢。
答案 0 :(得分:2)
生成的SQL更复杂,但通常性能是由于LINQ查询编译开销造成的。您需要进行配置以确定。一种可能的解决方法是使用预编译查询,第二次和以后的查询速度会更快。更好的解决方法可能是仅使用您需要的数据的投影,而不是在查询中包含4个实体,这相当于所有4个表上的SELECT *
。如果您需要所有这些完整实体,另一个可能的修复是显式加载细节,这意味着更多(但更快!)查询。