我对使用实体框架生成的 SQL 查询有一个奇怪的问题。我有一个低调的场景:
(所有时间都来自 SQL Profiler,所以不涉及 EF 代码)
- 我重新启动服务器
- 我启动 SQL Proviler 看时间
- 我通过 EF 从应用程序运行查询 - 需要 12 秒
- 我将查询从 SQL Proviler 复制到 SQL 查询分析器 - 需要 340 毫秒
- 我再次从应用程序通过 EF 运行查询 - 需要 12 秒
- 我从 SQL 查询分析器再次运行查询 - 需要 320 毫秒(我可以一遍又一遍地重复此过程,结果相同)
此外,如果我在重新启动服务器后直接从 SQL 查询分析器运行查询,那么第一次只需要大约 1 秒,而不是上面描述的相同场景。
编辑:我找到了一个解决方案,但我不知道为什么这会加快查询速度。所以这仍然是一个悬而未决的问题......???
我在 LINQ 查询中使用了 .AsNoTracking 方法。如果我删除此语句,查询将在 320 毫秒内执行。这可能与 EF 与 NoTracking 一起使用的锁定级别有关吗?
任何提示/想法都会非常棒。马库斯