我正在进行一些测试,直接LINQ-to-SQL查询运行速度比通过LINQ查询调用存储过程快至少80%
在SQL Server探查器中,使用通用LINQ查询
var results = from m in _dataContext.Members
select m;
只用了19毫秒而不是存储过程
var results = from m in _dataContext.GetMember(userName)
select m;
(GetMember
是存储过程)执行相同的查询,耗时100毫秒
为什么会这样?
修改
直接LINQ在Profiler中看起来像这样。
SELECT
[t1].[MemberID], [t1].[Aspnetusername], [t1].[Aspnetpassword],
[t1].[EmailAddr], [t1].[DateCreated],
[t1].[Location], [t1].[DaimokuGoal], [t1].[PreviewImageID],
[t1].[value] AS [LastDaimoku],
[t1].[value2] AS [LastNotefied],
[t1].[value3] AS [LastActivityDate], [t1].[IsActivated]
FROM
(SELECT
[t0].[MemberID], [t0].[Aspnetusername], [t0].[Aspnetpassword],
[t0].[EmailAddr], [t0].[DateCreated], [t0].[Location],
[t0].[DaimokuGoal], [t0].[PreviewImageID],
[t0].[LastDaimoku] AS [value], [t0].[LastNotefied] AS [value2],
[t0].[LastActivityDate] AS [value3], [t0].[IsActivated]
FROM
[dbo].[Members] AS [t0]) AS [t1]
WHERE
[t1].[EmailAddr] = @p0
存储过程就是这个
SELECT Members.*
FROM Members
WHERE dbo.Members.EmailAddr = @Username
所以你看到存储过程查询要简单得多......但它的速度慢......对我来说毫无意义。
答案 0 :(得分:3)
1)比较喜欢。在两种情况下执行完全相同的操作,而不是在一种情况下获取所有值并在另一种情况下执行查询。
2)不要只执行一次代码 - 执行很多次,因此优化器有机会工作并避免一次性性能命中。
3)使用分析器(好吧,一个在.NET端,一个在SQL端)来找出性能实际的不同之处。
答案 1 :(得分:1)
可能使速度变慢的一件事是select *。通常,如果指定了列,查询会更快,特别是如果LINQ查询未在查询中使用所有可能的列,则它将比select *快。
答案 2 :(得分:1)
我忘记了,proc也可能有参数嗅探问题。
答案 3 :(得分:0)
在评论中注明的一些是,你不是在比较苹果和苹果。您正在尝试比较两个不同的查询,从而得到不同的结果。
如果您想尝试确定性能,则需要比较相同的SAME查询,等等。
此外,您可以尝试使用LinqPad查看生成的SQL,以便潜在地识别导致响应缓慢的区域。
答案 4 :(得分:0)
*将延长运行查询所花费的时间。此外,您在探查器中看到的LINQ中的直接SQL是对所有对象名称进行包围([]) - 这将为LINQ查询的查询执行时间缩短更多时间。
答案 5 :(得分:0)
我可以添加John Skeet的答案,在运行代码几次时请记得清理任何查询缓存。
我建议对两个查询使用'EXPLAIN':似乎MySQL为查询和SP创建查询执行计划的方式不同。对于SP,它在使用它们的值替换参数之前符合,因此它不使用在硬编码或替换参数的情况下使用的索引。以下是来自SO的another question about different run times for SP and straight query,其中包含针对这两种情况的查询计划数据。