2012-04-06 59 views
3

我已经继承了一些C#/ ASP.NET MVC /实体框架项目缓慢。数据库中没有太多数据,但致电.Include()导致速度变慢。实体框架+ LINQ缓慢与字符串查询速度?

但是,我发现了一些很奇怪的东西。我有一个只有数字(5列)的2k行表。我在我正在搜索的列上有索引。

在做:

_entities.MyTable.Where(x=> x.Id1 == 4 && x.Id2 == 5).First() 

它需要我的开发机器上1800ms。

然而,当我这样做:

_entities.MyTable.Where("it.Id1 = 4 and it.Id2 = 5").First() 

它需要像10毫秒。

这是怎么回事?我不明白为什么LINQ表达式会这么慢。

+1

尝试在LinqPad中解开它,并将其生成的SQL查询与您自己的 – Tigran 2012-04-06 07:04:30

+0

进行比较是否在任何实体中继承MyTable? – daryal 2012-04-06 07:23:19

+0

@daryal对不起,在EF的情况下,我仍然是一个小菜鸟,那会是什么样子?这个对象/模型与其他对象有关。表中的数字是其他表的外键。 – 2012-04-06 07:25:34

回答

0

打开Sql Profiler,查看来自EF的查询。尝试分析它,制定计划。似乎EF以奇怪的方式执行查询,而没有获取索引。

+0

因为我正在运行SQL Express,所以我的开发箱上没有配置文件。任何其他方式来做到这一点?我让SQL Server Management Studio运行/调试查询。 – 2012-04-06 07:04:10

+0

不知道这里是否允许在其他资源上发布链接,但谷歌“SQL服务器获取所有查询”。有很多方法可以在没有profiler的情况下运行查询 – 2012-04-06 07:14:10

+0

我使用的LinqPad基于上面的建议,它和String方法一样快,但参数的顺序很奇怪......它在做“where(4 = Id1 )和(5 = Id2)“而不是Id1 = 4和Id2 = 5。虽然在LinqPad中看起来并没有让性能大打折扣。 – 2012-04-06 07:16:02

0

难道是EF需要生成SQL来执行第一个示例中的where子句,而第二个SQL更容易生成,因为它只需插入已提供的SQL?

我发现EF在生成查询时非常缓慢,在这种情况下,它似乎不太可能作为它在这两种情况下的一个相当简单的查询。

您是否尝试过编译第一个查询并多次运行它,以检查执行时间是否仅包括实际运行SQL,而不仅仅是生成它?