具有Linq性能问题的EntityFramework 6.1.1

Pat*_*her 5 c# linq sql-server entity-framework

我正在使用EntityFramework从我的mssql数据库中选择数据.我的查询看起来像这样:

int param = 123456;
using (var context = new DatabaseContext())
{
    var query = context.Table.AsQueryable();
    var result = query.Where(o => o.Id == param).ToList();
}
Run Code Online (Sandbox Code Playgroud)

此查询大约需要10秒钟.

using (var context = new DatabaseContext())
{
    var query = context.Table.AsQueryable();
    var result = query.Where(o => o.Id == 123456).ToList();
}
Run Code Online (Sandbox Code Playgroud)

此查询不到1秒.

我刚刚发现EntityFramework会生成两个不同的查询.

查询1:

SELECT TOP (20) 
[Project1].[Id] AS [Id], 
[Project1].[Name] AS [Name],  
FROM ( SELECT [Project1].[Id] AS [Id], [Project1].[Name] AS [Name], row_number() OVER (ORDER BY [Project1].[Id] DESC) AS [row_number]
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Name] AS [Name]
        FROM [dbo].[Table] AS [Extent1]
        WHERE [Extent1].[Id] = @p__linq__0
    )  AS [Project1]
)  AS [Project1]
WHERE [Project1].[row_number] > 0
ORDER BY [Project1].[Id] DESC
-- p__linq__0: '2932323' (Type = Int32, IsNullable = false)
Run Code Online (Sandbox Code Playgroud)

查询2:

SELECT TOP (20) 
[Filter1].[Id] AS [Id], 
[Filter1].[Name] AS [Name]
FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], row_number() OVER (ORDER BY [Extent1].[Id] DESC) AS [row_number]
    FROM [dbo].[Table] AS [Extent1]
    WHERE 2932323 = [Extent1].[Id]
)  AS [Filter1]
WHERE [Filter1].[row_number] > 0
ORDER BY [Filter1].[Id] DESC
Run Code Online (Sandbox Code Playgroud)

有没有办法加快第一种或另一种方式来做到这一点?

tsc*_*007 2

恕我直言,看到了 sql 查询,这不仅仅是 EF 相关的性能问题,而是 SQL Server 性能问题。

您应该考虑以下事项:

  • 由于 Id 不是 PK:在其上创建索引;
  • 用于EXEC sp_updatestats更新统计信息并帮助数据库服务器产生更好的执行计划。

顺便说一句:SSMS 中的查询 1 需要多长时间?