【问题标题】:EntityFramework - query execution time depends on select order?EntityFramework - 查询执行时间取决于选择顺序?
【发布时间】:2012-01-19 19:03:26
【问题描述】:

我注意到奇怪的行为。我有商家和订单表,做两个选择一个,然后,选择非常简单(从商家选择 *,从订单中选择 *)。

这是 sql profiler 跟踪,当我选择第一个商家,然后是订单时:

请注意,订单选择需要 75 秒(即大约 80.000 条记录,在一台非常不错的 8gb ram、ssd、i7 机器上)。

现在,如果我更改顺序并选择第一个订单,那么商家:

订单查询执行时间在分析器中下降到 2.5 秒,但在应用程序中它与第一种情况大致相同(我猜是因为 EF 内部试图将订单绑定到商家,因为它们之间存在外键)。

所以问题是为什么分析器看到不同的时间以及 EF 在第二种情况下做了这么长时间,可能是配置错误?

更新:我已经开始用干净的 EF 模型本地化问题,它工作正常。我正在使用 EF T4 模板来生成上下文和实体类,所以它可能已经过时并导致问题,如果会找到具体的东西,我会知道 - 我认为这与修复集合有某种关系,所以看起来 SQL 探查器具有误导性- 我猜查询执行得很好,只是它等待 EF 完成读取结果或 smth(我的意思是可能是 EF 在读取结果时做了一些昂贵的事情)。

 using (var myEntities = new myEntities())
        {
            var merchants = myEntities.Merchants.ToList();
            var orders = myEntities.Orders.ToList();
        }

【问题讨论】:

  • 如果没有看到 EF 生成的实际 SQL 语句,很难说。
  • 你重复这个测试几次了吗?
  • 请贴出你的c#具体查询代码
  • 在分析器 sql 中看起来像 select * from 商家(订单),只是 * 列出了所有字段,如果我将相同的查询复制到 sql manager 并运行它,它只需要几分之一秒,没有 subseclects,没有连接,没有任何可疑之处,两个表都有 10-20 个字段,正如您从图像读取中注意到的那样,不是很多。

标签: c# tsql entity-framework entity-framework-4


【解决方案1】:

读取是相同的:两组数据只有 CPU 和持续时间不同。

在第一次迭代中,您将数据从磁盘加载到 SQL Server 的缓存中。然后第二个查询从 RAM 而不是磁盘读取 4008 页。商家数据也是如此,但规模较小

注意:表数据和索引被缓存,不是查询结果。每次都会重新执行查询。此缓存由 SQL Server 保持最新

您已经说过这是可重复的:所以向我们展示代码。没有运行任何清除缓存的 DBCC? SET 选项一样吗?

【讨论】:

  • 我在问题中添加了示例代码,并猜测问题出在哪里。
【解决方案2】:

持续时间包括执行时间和获取时间。因为如果商家已经加载到上下文中,EF 必须在 Order 实例的具体化过程中建立 FK,因此获取速度会更慢。

【讨论】:

    【解决方案3】:

    所以,我发现了问题 - 过时的 POCO 模板,provided by MS。 Ants profiler 显示,大部分时间都花在管理修复集合上。

    使用 T4 模板:77.4124277 秒
    使用 edmx 生成的默认代码:1.783102 秒

    正如 Vitaliy 提到的 - SQL Profiler Duration 包括执行和获取时间,我认为这首先让我感到困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2020-04-22
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多