C# LINQ到实体查询优化-性能差
在我的EF6应用程序中,到处都有一些性能非常差的查询。这里有一个查询需要将近3000毫秒才能执行。(本地主机到外部sql server) 很明显,这件事有点不对劲,可能是显而易见的。但我不知道那是什么 使现代化 由此生成的SQL是:C# LINQ到实体查询优化-性能差,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,在我的EF6应用程序中,到处都有一些性能非常差的查询。这里有一个查询需要将近3000毫秒才能执行。(本地主机到外部sql server) 很明显,这件事有点不对劲,可能是显而易见的。但我不知道那是什么 使现代化 由此生成的SQL是: SELECT TOP (10) [Project1].[C1] AS [C1], [Project1].[Id] AS [Id], [Project1].[FirstName] AS [FirstName], [Project
SELECT TOP (10)
[Project1].[C1] AS [C1],
[Project1].[Id] AS [Id],
[Project1].[FirstName] AS [FirstName],
[Project1].[LastName] AS [LastName],
[Project1].[Name] AS [Name],
[Project1].[DueDateTime] AS [DueDateTime]
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[DueDateTime] AS [DueDateTime],
[Extent2].[FirstName] AS [FirstName],
[Extent2].[LastName] AS [LastName],
[Extent3].[Name] AS [Name],
1 AS [C1]
FROM [dbo].[Activities] AS [Extent1]
INNER JOIN [dbo].[Customers] AS [Extent2] ON [Extent1].[CustomerId] = [Extent2].[Id]
INNER JOIN [dbo].[ActivityTypes] AS [Extent3] ON [Extent1].[ActivityTypeId] = [Extent3].[Id]
WHERE (0 = [Extent1].[IsComplete]) AND ([Extent1].[AssignedUserId] = 037da3f4-99cc-4338-8b36-491ca0fcfcb1 /* @p__linq__0 */)
) AS [Project1]
ORDER BY [Project1].[DueDateTime] ASC
首先,如果启用,则在上下文中打开懒散加载。。。表现很差,真的很差。如果启用,则将忽略包含 在您的示例中,当您在查询中使用某个实际类时,选择不是在SQL Server端完成的,而是通过C#完成的。这意味着它将对所有表执行联接操作,执行“选择*”,因为他不知道需要哪些字段,然后映射它。慢,真慢
dash.UserActivities = db.Activities..Where(a => a.AssignedUserId == userId && a => !a.IsComplete).OrderBy(a => a.DueDateTime).Select( a => new {
Id = a.Id,
CustomerFirstName = a.Customer.FirstName,
CustomerLastName = a.Customer.LastName,
ActivityType = a.ActivityType.Name,
DueDateTime = a.DueDateTime
}).Take(10).Select(
a => new ActivityViewModel()
{
Id = a.Id,
CustomerFirstName = a.CustomerFirstName,
CustomerLastName = a.CustomerLastName ,
ActivityType = a.ActivityType
DueDateTime = a.DueDateTime,
}
).ToList();
正如@MarcinJuraszek在评论中所建议的,我们需要在本地执行这些查询,并在这里审核性能。使用tuning adviser,我们发现了许多改进的机会。您是否检查了为您的查询生成的SQL?好吧,对于初学者,您可以删除两个
Include
语句,因为您没有在查询结果中投影任何一个集合。@Servy请查看上面的更新。我想您是想在那里回复@MarcinJuraszek,因为他是请求生成SQL的人。SQL查询看起来是正确的。您应该直接对数据库运行它,并验证执行时间和生成的执行计划。所有索引都正确吗?生成的SQL表明查询提供程序可以很好地支持他正在做的事情,并且只选择所需的列。确实有一些查询提供程序不支持此功能,但这一个显然支持。延迟加载在这里也不相关,因为他没有投射出包含可以延迟加载的属性的整个实体。不正确。看看问题中添加的生成的SQL。当我写我的答案时,SQL没有显示:)对不起,伙计们
dash.UserActivities = db.Activities..Where(a => a.AssignedUserId == userId && a => !a.IsComplete).OrderBy(a => a.DueDateTime).Select( a => new {
Id = a.Id,
CustomerFirstName = a.Customer.FirstName,
CustomerLastName = a.Customer.LastName,
ActivityType = a.ActivityType.Name,
DueDateTime = a.DueDateTime
}).Take(10).Select(
a => new ActivityViewModel()
{
Id = a.Id,
CustomerFirstName = a.CustomerFirstName,
CustomerLastName = a.CustomerLastName ,
ActivityType = a.ActivityType
DueDateTime = a.DueDateTime,
}
).ToList();