Linq to sql 存储过程比LINQ查询慢?
我做了一些测试,与通过LINQ查询调用存储过程相比,直接LINQ到SQL查询的运行速度至少快80% 在SQL Server探查器中,一个通用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毫
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查询返回所有行比在存储过程中返回一行要快。