加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – System.Web.Providers.DefaultMembershipProvider有

发布时间:2020-12-16 03:15:46 所属栏目:asp.Net 来源:网络整理
导读:我们已经开始使用NuGet的Microsoft.AspNet.Providers.Core包中提供的更新的System.Web.Providers.我们开始迁移现有用户,发现性能下降,然后发生死锁.这个用户少于30,000(远远低于我们需要创建的1,000,000个用户).当我们调用提供程序时,它来自每个服务器上的多
我们已经开始使用NuGet的Microsoft.AspNet.Providers.Core包中提供的更新的System.Web.Providers.我们开始迁移现有用户,发现性能下降,然后发生死锁.这个用户少于30,000(远远低于我们需要创建的1,000,000个用户).当我们调用提供程序时,它来自每个服务器上的多个线程,并且有多个服务器运行此相同的进程.这是为了能够尽快创建我们所需的所有用户,并模拟我们期望在其上线时看到的负载.

SQL Server为死锁生成的日志包含以下EF生成的sql:

SELECT
    [Limit1].[UserId] AS [UserId],[Limit1].[ApplicationId] AS [ApplicationId],[Limit1].[UserName] AS [UserName],[Limit1].[IsAnonymous] AS [IsAnonymous],[Limit1].[LastActivityDate] AS [LastActivityDate]
FROM
    (SELECT TOP (1)
        [Extent1].[UserId] AS [UserId],[Extent1].[ApplicationId] AS [ApplicationId],[Extent1].[UserName] AS [UserName],[Extent1].[IsAnonymous] AS [IsAnonymous],[Extent1].[LastActivityDate] AS [LastActivityDate]
     FROM
        [dbo].[Users] AS [Extent1]
        INNER JOIN [dbo].[Applications] AS [Extent2] ON [Extent1].[ApplicationId] = [Extent2].[ApplicationId]
     WHERE
        ((LOWER([Extent2].[ApplicationName])) = (LOWER(@p__linq__0)))
        AND ((LOWER([Extent1].[UserName])) = (LOWER(@p__linq__1)))
    ) AS [Limit1]

我们手动运行查询,执行计划表示它正在执行表扫描,即使存在基础索引.原因是使用LOWER([Extent1].[UserName]).

我们查看了提供程序代码,看看我们是否做错了什么,或者是否有办法拦截或替换数据库访问代码.我们没有看到任何选项,但我们确实找到了LOWER问题的来源,在列和参数上都调用了.ToLower().

return (from u in ctx.Users
    join a in ctx.Applications on u.ApplicationId equals a.ApplicationId into a
    where (a.ApplicationName.ToLower() == applicationName.ToLower()) && (u.UserName.ToLower() == userName.ToLower())
    select u).FirstOrDefault<User>();

有没有人知道我们改变提供者的行为以不使用.ToLower()以便允许使用索引的方法?

解决方法

您可以在每个 Sql Server : Lower function on Indexed Column的较低(用户名)上创建索引

ALTER TABLE dbo.users ADD LowerFieldName AS LOWER(username) PERSISTED
CREATE NONCLUSTERED INDEX IX_users_LowerFieldName_  ON dbo.users(LowerFieldName)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读