在IIS上托管的ASP.NET Web应用程序的Entity Framework发生了非常奇怪的问题。我们有一个简单的查询,在应用程序运行的时间越长,运行速度越慢。通过visual studio在本地调试时,无法复制到目前为止的问题。
var query = context.Stocktakes
.Include(s => s.Items)
.Include(s => s.Items.Select(i => i.Product))
.Where(s => s.StocktakeID == stocktakeID && s.SiteID == siteID)
.AsNoTracking()
.SingleOrDefault();
重新启动应用程序池后,查询的运行时间不到1/4秒。一旦应用程序上出现少量流量,查询性能就会开始降低,需要6秒,而且在托管应用程序几个小时之后最多会持续22秒。
通过SQL Server Manager运行时的相同查询总是花费不到1/4秒。清除执行计划几乎没有效果,所以我不相信这个问题是由于参数嗅探造成的。我创建了一个在同一个应用程序池下运行的应用程序的副本,并且在一个不同的应用程序池下,只有我自己连接它并且查询性能不会降低,它仍然很快,查询时间不到1/4。< / p>
有没有人对正在发生的事情有任何想法?
编辑:问题与嵌套投影无关,因为在给出的示例中没有对非实体类的投影。该示例显示了直接从上下文查询实体。为嵌套投影提供的链接也无法解释为什么查询性能会随着时间的推移而降低。
答案 0 :(得分:0)
性能下降的原因是因为web.config文件中的以下行;
<trust legacyCasModel="true" level="Full" />
我认为由于Entity Framework对其某些操作使用动态数据,因此LegacyCasModel设置与实体框架不兼容。
对于发布此设置以提高其本地SSRS报告效果的任何人,如果发布此设置,以下帖子可帮助我停用上述设置并仍然快速生成报告。