Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有Linq性能问题的EntityFramework 6.1.1_C#_Sql Server_Linq_Entity Framework - Fatal编程技术网

C# 具有Linq性能问题的EntityFramework 6.1.1

C# 具有Linq性能问题的EntityFramework 6.1.1,c#,sql-server,linq,entity-framework,C#,Sql Server,Linq,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(); } 此查询大约需要10秒钟 using (var contex

我正在使用EntityFramework从mssql数据库中选择数据。我的查询如下所示:

int param = 123456;
using (var context = new DatabaseContext())
{
    var query = context.Table.AsQueryable();
    var result = query.Where(o => o.Id == param).ToList();
}
此查询大约需要10秒钟

using (var context = new DatabaseContext())
{
    var query = context.Table.AsQueryable();
    var result = query.Where(o => o.Id == 123456).ToList();
}
此查询不到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)
问题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

有没有一种方法可以加快第一种或另一种方法的速度?

imho,看到sql查询,这不仅是一个与EF相关的性能问题,而且是一个sql server性能问题

你应该考虑以下几点:

  • 由于Id不是PK:在其上创建索引
  • 使用
    EXEC sp_updatestats
    更新统计信息并帮助db服务器生成更好的执行计划
顺便问一下:查询1在SSMS中需要多长时间?

我找到了解决方案

我使用sp_重新编译放弃了所有执行计划,现在一切正常

谢谢你的帮助


p.

能否显示为每个查询生成的查询?另外,为什么不直接查询
上下文
?为什么要使用
AsQueryable()
AsQueryable()
在这两者中都是多余的cases@haim770冗余,是的,但没有问题或有害。带int参数的一个将成为func而不是另一个表达式,你确定吗?并且查询仍然不同?带参数的查询速度仍然较慢,因为EF生成的查询仍然相同。但两者所用的时间相同