实体框架查询 - 自动编译已关闭,但第二个查询仍然快得多

时间:2012-10-28 16:46:28

标签: entity-framework entity-framework-4

我使用Visual Studio 2012和Windows 7,64位架构,4核实现了Entity Framework 4.0 .net 4.0。

我正在使用AdventureWorks数据库对控制台应用程序执行一些测试。困扰我的是我第一次拿一些产品比第二次需要更多的时间,我想知道为什么。

我知道Entity Framework在第一次查询时会执行一些任务,所以我提前执行了一些额外的查询。

例如,我的main函数包含以下内容:

using (var context = new Context())
{
   execute context.Clients.ToList();   // <- this takes something like 300 ms
}

using (var context = new Context())
{
   execute context.Products.ToList();   // <- this takes something like 200 ms
}

using (var context = new Context())
{
   execute context.Products.ToList();   // <- this takes something like 10 ms
}

所以你看到所有“第一次执行”事情的第一个查询花了300毫秒。

第二个需要200秒,第三个与第二个相同只需要10毫秒。

所以我的问题是:为什么我的第三个查询花了这么短的时间?我不使用自动编译(因为在EF 4.0中没有这样的)或CompiledQuery类。

此外,我对Products的第一次调用不是模型的第一个查询,因此应该已经完成​​了视图生成的所有工作。

但是第一次花费这么多时间并且第二次打电话给产品时这么快。它在某处缓存了什么吗?

我注意到的另一件事是,当我将它编译为64位时,需要花费大量时间,比如一秒钟。当我将它编译为32位时,它需要我给出的数量。

你能在这里给我一些提示吗?

谢谢

1 个答案:

答案 0 :(得分:0)

阅读本文:Performance Considerations (Entity Framework)

除了生成视图外,EF还有很多工作要做。

此外,您对Products的第一次查询可能会导致您的数据库服务器将数据读入其缓存中。您应该使用SQL Server Profiler来区分数据库性能差异和客户端(EF)性能差异。

关于64位问题,这让我想起了a previous SO question