存储过程比LINQ查询慢?

时间:2008-11-04 19:12:50

标签: linq-to-sql stored-procedures

我正在进行一些测试,直接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

所以你看到存储过程查询要简单得多......但它的速度慢......对我来说毫无意义。

6 个答案:

答案 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,其中包含针对这两种情况的查询计划数据。