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

标签 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 毫秒

这是为什么?

编辑:

在 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/

相关文章:

c# - "Only arguments that can be evaluated on the client are supported for the String.Contains method"

c# - linq to sql SubmitChanges 不触发具有多个 InsertOnSubmit 或 DeleteOnSubmit 的触发器

.net - 为什么我会收到 "method has no supported translation to SQL"错误?

stored-procedures - 不修改的 Derby 程序

sql - PLpgSQL(或 ANSI SQL?)列上的条件计算

c# - 如何将以下 SQL 转换为 Linq?

c# - MySQl Entity Framework C# 外键数据加载延迟错误

sql-server - SQLServer 在存储过程中找不到我的用户定义函数

MySQL-存储过程-尝试使用输出参数时的怪异

sql-server - TSQL - 合并两个表