0

我对使用实体框架生成的 SQL 查询有一个奇怪的问题。我有一个低调的场景:

(所有时间都来自 SQL Profiler,所以不涉及 EF 代码)

  • 我重新启动服务器
  • 我启动 SQL Proviler 看时间
  • 我通过 EF 从应用程序运行查询 - 需要 12 秒
  • 我将查询从 SQL Proviler 复制到 SQL 查询分析器 - 需要 340 毫秒
  • 我再次从应用程序通过 EF 运行查询 - 需要 12 秒
  • 我从 SQL 查询分析器再次运行查询 - 需要 320 毫秒(我可以一遍又一遍地重复此过程,结果相同)

此外,如果我在重新启动服务器后直接从 SQL 查询分析器运行查询,那么第一次只需要大约 1 秒,而不是上面描述的相同场景。

编辑:我找到了一个解决方案,但我不知道为什么这会加快查询速度。所以这仍然是一个悬而未决的问题......???

我在 LINQ 查询中使用了 .AsNoTracking 方法。如果我删除此语句,查询将在 320 毫秒内执行。这可能与 EF 与 NoTracking 一起使用的锁定级别有关吗?

任何提示/想法都会非常棒。马库斯

4

1 回答 1

0

所以,我回答了我自己的问题——经过多天的搜索,我打开了一个微软事件。

真正的原因仍然不清楚,但如果通过 EF 执行,SQL Server 会以某种方式为查询选择不同的执行计划。所以有三种解决方案:

1) 更改表上的索引,以便明确执行计划 2) 向查询添加提示(目前无法使用 EF) 3) 在 SQL Server 中为此查询创建 plan_guide

我决定使用第一个解决方案。

于 2013-08-01T10:53:58.273 回答