【发布时间】: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