【问题标题】:Why is my linq to SQL query very slow?为什么我的 linq to SQL 查询很慢?
【发布时间】:2016-11-21 05:40:51
【问题描述】:

我得到了这个在生产环境中非常慢的查询。我想知道为什么以及是否有更好的方法来实现相同的结果。

public async Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email)
{
    return await (from m in this.Queryable()
                  where m.Email == email
                        && (m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL1ID)
                            || m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL3ID)
                            || m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL4ID))
                  select m).SingleOrDefaultAsync();
}

简而言之,此查询的目的是通过电子邮件获取用户成员资格并进行登录。我得到的用户会员越多,这个查询就越慢。

谢谢,

大卫

编辑

this.Queryable() 相当于做select * from MembershipsMembership表有很多角色,一个角色有很多成员。

此外,成员资格表最多需要 12 秒才能获取 240 行的登录信息。我必须按角色过滤,因为电子邮件值在系统中不是唯一的。只有某些角色有权登录,并且这些角色将拥有唯一的电子邮件。这就是我必须过滤的原因。此查询返回一个成员资格以继续登录,该成员资格已通过上述查询选择。所以没有IQueryableIEnumerableList,只有SingleOrDefault 值。

【问题讨论】:

  • this.Queryable() ???您没有提供太多信息.. this 是什么?! Queryable() 方法返回什么?显示该代码?
  • 对不起!代码位于存储库架构中。我在编辑部分提供了更多信息。
  • 我们可能需要查看 SQL 表定义以及任何索引。
  • 你能显示从调试器生成的 SQL 吗?它可能会为您提供一些见解...

标签: c# sql linq


【解决方案1】:

我认为生成的查询非常糟糕,因为您多次执行相同的操作:

m.RoleMemberships.Select(r => r.RoleId)

相反,您可以这样做一次:

public Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email)
{
    return (from m in this.Queryable()
            where m.Email == email
              && (m.RoleMemberships.Any(
                    r => r.RoleId == RoleConstants.ACCESSGRANTEDL1ID 
                      || r.RoleID == RoleConstants.ACCESSGRANTEDL3ID 
                      || r.RoleID == RoleConstants.ACCESSGRANTEDL4ID)
            select m).SingleOrDefaultAsync();
}

我猜以上内容会让事情变得更好。您可以使用调试器检查两种情况下生成的查询。

另外请注意,您不需要等待结果,只需返回任务,调用者就需要等待它。

【讨论】:

  • " is very band" - 你的意思是“bad”、“broad”还是别的什么?
【解决方案2】:

我认为要加载的数据很多,而 EF 是一种非常慢的映射技术,它会创建有趣的查询(你可以看到这个here)。你有性能问题吗?也许你应该选择其他映射技术(堆栈例如Dapper)。当我们进行测试时,它的速度是 EF 的两倍。

【讨论】:

  • 你如何推断​​ EF 在这里发挥作用?
  • 再说一次,如果我们有大数据,速度不快,这就是为什么我认为是这种情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多