Linq to sql 存储过程比LINQ查询慢?

Linq to sql 存储过程比LINQ查询慢?,linq-to-sql,stored-procedures,Linq To Sql,Stored Procedures,我做了一些测试,与通过LINQ查询调用存储过程相比,直接LINQ到SQL查询的运行速度至少快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查询调用存储过程相比,直接LINQ到SQL查询的运行速度至少快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看起来像这样

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

因此,您可以看到存储过程查询要简单得多。。但它的速度较慢。。。。这对我来说毫无意义。

在评论中提到的一点是,你不是在比较苹果。您试图比较两个不同的查询,从而得到不同的结果

如果您想尝试并确定性能,您可能需要比较相同的查询、相同的值等

另外,您可以尝试使用LinqPad来查看生成的SQL,以潜在地识别导致响应缓慢的区域。

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

2) 不要只执行一次代码——要执行很多次,这样优化器就有机会工作,避免一次性的性能问题


3) 使用探查器(一个在.NET端,一个在SQL端)找出性能的实际差异。

一个可能会使它变慢的是select*。通常,如果指定了列,查询速度会更快,特别是如果LINQ查询没有使用查询中所有可能的列,那么查询速度会比select快*

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

运行查询所需的时间会延长很多。此外,您在profiler中看到的来自LINQ的直接SQL将([])所有对象名称括起来-这将减少LINQ查询执行时间的更多时间。

我可以补充一下John Skeet的回答吗,在多次运行代码时,请记住清理所有查询缓存


我可以建议对两个查询都使用“EXPLAIN”:MySQL似乎为一个查询和SP创建了不同的查询执行计划。对于SP,它在用参数值替换参数之前符合要求,因此它不使用硬编码或替换参数时使用的索引。下面是两种情况下的查询计划数据。看起来您的两个查询做的事情并不相同。第二个接受一个参数(可能是为了限制结果),其中第一个显然只是获取所有行。对于初学者,您确定SQL是相同的吗?存储过程中的SQL与linq查询所做的是相同的…基本上,您的参数是正确的。。。通过linq查询返回所有行比在存储过程中返回一行要快。