EntityFramework - 查询执行时间取决于选择顺序?

时间:2012-01-19 09:11:13

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

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

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

注意,订单选择正在服用75秒(这是一个~80.000记录,在一台非常体面的机器上8gb ram,ssd,i7)。

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

命令查询执行时间在分析器中降至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();
        }

3 个答案:

答案 0 :(得分:2)

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

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

注意:表格数据和索引已缓存,查询结果。查询将每次执行新鲜。 SQL Server

使此缓存保持最新

你说这是可重复的:所以告诉我们代码。没有运行任何清除缓存的DBCC? SET选项一样吗?

答案 1 :(得分:1)

持续时间包括执行和获取时间。因为在商家已经加载到上下文的情况下,EF必须在Order实例的实现期间建立FK,所以获取速度较慢。

答案 2 :(得分:0)

所以,我发现了问题 - 过时的POCO模板,provided by MS。 蚂蚁分析器显示,大部分时间都用于管理修复集合。

  

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

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

相关问题