我做了一些测试,直接的 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 毫秒
这是为什么?
编辑:
在 Profiler 中,直接的 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
所以你看到存储过程查询更简单..但是它更慢......对我来说没有意义。
最佳答案
1) 同类比较。在这两种情况下执行完全相同的操作,而不是在一种情况下获取所有值并在另一种情况下执行查询。
2) 不要只执行一次代码 - 执行很多次,这样优化器就有机会工作并避免一次性性能下降。
3) 使用探查器(好吧,一个在 .NET 端,一个在 SQL 端)找出性能实际上不同的地方。
关于linq-to-sql - 存储过程比 LINQ 查询慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/263023/