【问题标题】:Entity Framework query - auto-compile is off, but still the second query is much faster实体框架查询 - 自动编译已关闭,但第二个查询仍然快得多
【发布时间】:2023-03-29 16:40:01
【问题描述】:

我获得了 .net 4.0 和 Entity Framework 4.0 以及 Visual Studio 2012 和 Windows 7、64 位架构、4 核。

我正在使用 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 毫秒。

第二个需要200s,第三个,和第二个一样只需要10ms。

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

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

但是第一次调用产品仍然需要很长时间,而第二次调用 Products 时又是如此之快。它会在某处缓存一些东西吗?

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

你能给我一些提示吗?

谢谢

【问题讨论】:

    标签: entity-framework entity-framework-4


    【解决方案1】:

    阅读:Performance Considerations (Entity Framework)

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      相关资源
      最近更新 更多