Linq查询超级慢?

Who*_*nja 2 .net linq ado.net entity-framework-4

我从sql profiler复制了linq构建的sql查询,这里有什么令人讨厌的事情:

  1. 它前缀select ..columnNames ..来自(select ..columnNames .. from(从视图中选择cNames)注释:这里的2个select语句是不必要的.

  2. 此查询需要14秒才能执行

  3. 当我删除最后一行,包含所有参数,如@p_ linq _0 ..并在where条件中填充参数值并执行相同的动态查询时需要1秒或更短时间.即使从sql studio执行此查询也需要0秒.这是linq的蹩脚.

我可能会把它移到存储过程但我现在害怕使用linq

经过进一步的研究,我发现:

查询1:

exec sp_executesql N'SELECT * from TableView WHERE Id = @Id', N'@Id int', @Id = 1
Run Code Online (Sandbox Code Playgroud)

查询2:

exec sp_executesql N'SELECT * from TableView WHERE Id = 1'
Run Code Online (Sandbox Code Playgroud)

查询1需要12秒,查询2需要0秒.这解释了为什么linq查询很慢.所以现在,这是否意味着我应该总是使用存储过程或者我错过了什么?

为什么Microsoft无法修复Linq查询构建,解析该字符串并替换param值而不是将这些params作为参数传递给sp_executesql是多么困难

Ste*_*ham 6

我和你在一起.我的意思是,你可能会发现你发现这种灾难性性能的原因并找到补救措施.但实际上,这种事情发生在Linq to SQL上,并花费额外的时间来优化你的Linq语句,以便SQL查询在后端类型上的性能更加失败.Linq应该让事情变得更容易.

我个人使用Linq-to-SQL或Entity Framework在单个记录上执行CRUD操作.然后对于任何大型SELECT语句,我只会编写一个存储过程,就像我一直在做的那样.这似乎是生产力和性能之间的良好折衷,对我来说效果很好.

编辑:事实上,实体框架的人们预料到了这一点.实体框架与存储过程非常相似.您可以将存储过程添加到Entity Framework模型中,并获得所有强类型的好处.然后,您可以从代码中调用该存储过程.