如果删除 AsNoTraking,速度会更快 - 为啥? - 实体框架 5.0 - SQL Server 2008 R2

Posted

技术标签:

【中文标题】如果删除 AsNoTraking,速度会更快 - 为啥? - 实体框架 5.0 - SQL Server 2008 R2【英文标题】:Better Speed if removing AsNoTraking - why? - Entity Framework 5.0 - SQL Server 2008 R2如果删除 AsNoTraking,速度会更快 - 为什么? - 实体框架 5.0 - SQL Server 2008 R2 【发布时间】:2013-07-15 07:40:31 【问题描述】:

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

(所有时间均来自 SQL Profiler,因此不涉及 EF 代码)

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如果删除 AsNoTraking,速度会更快 - 为啥? - 实体框架 5.0 - SQL Server 2008 R2的主要内容,如果未能解决你的问题,请参考以下文章

删除向量行时如何更快?

严重影响电脑反应速度的坏习惯有哪些?

如何设置eclipse运行速度

如果给予更多限制,Ortools/gurobi 会运行得更快吗?

mysql 索引

EOSIO生态一周资讯 | BM:EOSIO速度快 而且只会更快