2008-11-04 70 views
3

我在做一些测试和直LINQ到SQL查询的运行速度比如果通过LINQ查询存储过程比LINQ查询慢吗?

调用存储过程在SQL Server Profiler中一个通用的LINQ查询

var results = from m in _dataContext.Members 
select m; 

了至少快80%只有19毫秒,而不是一个存储过程

var results = from m in _dataContext.GetMember(userName) 
select m; 

GetMember被存储的过程)做历时100毫秒

相同的查询

这是为什么?

编辑:

直LINQ看起来像这样在探查

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

它看起来不像你的两个查询做同样的事情。第二个参数(大概是为了限制结果),其中第一个显然只是获得所有行。对于初学者,你确定SQL是一样的吗? – 2008-11-04 19:21:33

+0

存储过程中的sql与linq查询的功能相同...本质上与你是正确的参数...通过linq查询返回所有行比在存储过程中返回单个行更快。 – dswatik 2008-11-04 19:23:53

回答

3

1)比较like和like。在两种情况下执行完全相同的操作,而不是在一种情况下获取所有值并在另一种情况下执行查询。

2)不要只执行一次代码 - 执行很多次,所以优化器有机会工作并避免一次性的命中。

3)使用一个分析器(好的,一个在.NET端,一个在SQL端)来找出性能是实际上不同的地方。

0

在评论中指出,这其中的一部分是你没有比较苹果和苹果。您正试图比较两个不同的查询,从而得到不同的结果。

如果您想尝试,并确定性能,你会希望比较同一查询,使用相同的价值观等

另外,你可以尝试使用LinqPad能够看到生成的SQL,以识别潜在的地区导致反应迟缓。

1

有一件事可能会让它变慢是select *。通常情况下,如果指定了列,则查询速度会更快。特别是,如果LINQ查询未在查询中使用所有可能的列,则它将比select *更快。

1

我忘了,proc也可能有参数嗅探问题。

0

*会延长运行查询所花费的时间。另外,你在profiler中看到的LINQ的直接SQL是将所有对象名称括起来([]) - 这将减少LINQ查询的查询执行时间的更多时间。

0

我可以添加John Skeet的答案,那就是在几次运行代码时,请记住清理任何查询缓存。

我可以建议在这两种查询中使用'EXPLAIN':似乎MySQL为查询和SP创建查询执行计划的方式不同。对于SP,它在将参数替换为它们的值之前遵守,因此它不使用索引,在硬编码或替代参数的情况下使用索引。这里是来自SO的another question about different run times for SP and straight query以及针对这两种情况给出的查询计划数据。