10

を生成します。すべてのものは、作業罰金ですが、テストで、私は次のコマンドでは、多くのデータベースを作成することがわかっアクセス: SignInManager.PasswordSignInAsync:SignInManager.PasswordSignInAsyncは、私はASP.NETのアイデンティティを使用して、自分のアプリケーションでは、多くのデータベース・アクセス

var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: true); 

を性能試験を使用してアプリケーションをテストするとき、私は、この問題を確認します。テストは、ログイン要求が応答を取得するには膨大な時間が必要であることを示しています。 enter image description here:次の図は、ログイン要求のための性能試験の結果を示しています。

それから私は、コマンドSignInManager.PasswordSignInAsyncが実行されたときに起こるかどうか確認するために、SQL Serverプロファイラを使用します。これは、データベースアクセスの多くが生成されていることを示しています。以下は、SQL Serverプロファイラから取得されます:

exec sp_executesql N'SELECT TOP (1) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserFullName] AS [UserFullName], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Online] AS [Online], 
    [Extent1].[LastOnlineDate] AS [LastOnlineDate], 
    [Extent1].[BrithDate] AS [BrithDate], 
    [Extent1].[Job] AS [Job], 
    [Extent1].[Gender] AS [Gender], 
    [Extent1].[CountryId] AS [CountryId], 
    [Extent1].[LivesIn] AS [LivesIn], 
    [Extent1].[RelationId] AS [RelationId], 
    [Extent1].[Religion] AS [Religion], 
    [Extent1].[FirstSchool] AS [FirstSchool], 
    [Extent1].[SecondSchool] AS [SecondSchool], 
    [Extent1].[University] AS [University], 
    [Extent1].[ContactInfo] AS [ContactInfo], 
    [Extent1].[Email] AS [Email], 
    [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
    [Extent1].[PasswordHash] AS [PasswordHash], 
    [Extent1].[SecurityStamp] AS [SecurityStamp], 
    [Extent1].[PhoneNumber] AS [PhoneNumber], 
    [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
    [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
    [Extent1].[UserName] AS [UserName] 
    FROM [dbo].[AspNetUsers] AS [Extent1] 
    WHERE ((UPPER([Extent1].[UserName])) = (UPPER(@p__linq__0))) OR ((UPPER([Extent1].[UserName]) IS NULL) AND (UPPER(@p__linq__0) IS NULL))',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'[email protected]' 

exec sp_executesql N'SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[ClaimType] AS [ClaimType], 
    [Extent1].[ClaimValue] AS [ClaimValue] 
    FROM [dbo].[AspNetUserClaims] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 

exec sp_executesql N'SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[ClaimType] AS [ClaimType], 
    [Extent1].[ClaimValue] AS [ClaimValue] 
    FROM [dbo].[AspNetUserClaims] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 

exec sp_executesql N'SELECT 
    [Extent1].[LoginProvider] AS [LoginProvider], 
    [Extent1].[ProviderKey] AS [ProviderKey], 
    [Extent1].[UserId] AS [UserId] 
    FROM [dbo].[AspNetUserLogins] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[RoleId] AS [RoleId] 
    FROM [dbo].[AspNetUserRoles] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT TOP (1) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserFullName] AS [UserFullName], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Online] AS [Online], 
    [Extent1].[LastOnlineDate] AS [LastOnlineDate], 
    [Extent1].[BrithDate] AS [BrithDate], 
    [Extent1].[Job] AS [Job], 
    [Extent1].[Gender] AS [Gender], 
    [Extent1].[CountryId] AS [CountryId], 
    [Extent1].[LivesIn] AS [LivesIn], 
    [Extent1].[RelationId] AS [RelationId], 
    [Extent1].[Religion] AS [Religion], 
    [Extent1].[FirstSchool] AS [FirstSchool], 
    [Extent1].[SecondSchool] AS [SecondSchool], 
    [Extent1].[University] AS [University], 
    [Extent1].[ContactInfo] AS [ContactInfo], 
    [Extent1].[Email] AS [Email], 
    [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
    [Extent1].[PasswordHash] AS [PasswordHash], 
    [Extent1].[SecurityStamp] AS [SecurityStamp], 
    [Extent1].[PhoneNumber] AS [PhoneNumber], 
    [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
    [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
    [Extent1].[UserName] AS [UserName] 
    FROM [dbo].[AspNetUsers] AS [Extent1] 
    WHERE [Extent1].[Id] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[ClaimType] AS [ClaimType], 
    [Extent1].[ClaimValue] AS [ClaimValue] 
    FROM [dbo].[AspNetUserClaims] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT 
    [Extent1].[LoginProvider] AS [LoginProvider], 
    [Extent1].[ProviderKey] AS [ProviderKey], 
    [Extent1].[UserId] AS [UserId] 
    FROM [dbo].[AspNetUserLogins] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 

    exec sp_executesql N'SELECT 
     [Extent1].[UserId] AS [UserId], 
     [Extent1].[RoleId] AS [RoleId] 
     FROM [dbo].[AspNetUserRoles] AS [Extent1] 
     WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
    exec sp_executesql N'SELECT TOP (1) 
     [Extent1].[Id] AS [Id], 
     [Extent1].[UserFullName] AS [UserFullName], 
     [Extent1].[UserId] AS [UserId], 
     [Extent1].[Online] AS [Online], 
     [Extent1].[LastOnlineDate] AS [LastOnlineDate], 
     [Extent1].[BrithDate] AS [BrithDate], 
     [Extent1].[Job] AS [Job], 
     [Extent1].[Gender] AS [Gender], 
     [Extent1].[CountryId] AS [CountryId], 
     [Extent1].[LivesIn] AS [LivesIn], 
     [Extent1].[RelationId] AS [RelationId], 
     [Extent1].[Religion] AS [Religion], 
     [Extent1].[FirstSchool] AS [FirstSchool], 
     [Extent1].[SecondSchool] AS [SecondSchool], 
     [Extent1].[University] AS [University], 
     [Extent1].[ContactInfo] AS [ContactInfo], 
     [Extent1].[Email] AS [Email], 
     [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
     [Extent1].[PasswordHash] AS [PasswordHash], 
     [Extent1].[SecurityStamp] AS [SecurityStamp], 
     [Extent1].[PhoneNumber] AS [PhoneNumber], 
     [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
     [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
     [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
     [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
     [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
     [Extent1].[UserName] AS [UserName] 
     FROM [dbo].[AspNetUsers] AS [Extent1] 
     WHERE [Extent1].[Id] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
    exec sp_executesql N'SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[UserId] AS [UserId], 
     [Extent1].[ClaimType] AS [ClaimType], 
     [Extent1].[ClaimValue] AS [ClaimValue] 
     FROM [dbo].[AspNetUserClaims] AS [Extent1] 
     WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT 
    [Extent1].[LoginProvider] AS [LoginProvider], 
    [Extent1].[ProviderKey] AS [ProviderKey], 
    [Extent1].[UserId] AS [UserId] 
    FROM [dbo].[AspNetUserLogins] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[RoleId] AS [RoleId] 
    FROM [dbo].[AspNetUserRoles] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT TOP (1) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserFullName] AS [UserFullName], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Online] AS [Online], 
    [Extent1].[LastOnlineDate] AS [LastOnlineDate], 
    [Extent1].[BrithDate] AS [BrithDate], 
    [Extent1].[Job] AS [Job], 
    [Extent1].[Gender] AS [Gender], 
    [Extent1].[CountryId] AS [CountryId], 
    [Extent1].[LivesIn] AS [LivesIn], 
    [Extent1].[RelationId] AS [RelationId], 
    [Extent1].[Religion] AS [Religion], 
    [Extent1].[FirstSchool] AS [FirstSchool], 
    [Extent1].[SecondSchool] AS [SecondSchool], 
    [Extent1].[University] AS [University], 
    [Extent1].[ContactInfo] AS [ContactInfo], 
    [Extent1].[Email] AS [Email], 
    [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
    [Extent1].[PasswordHash] AS [PasswordHash], 
    [Extent1].[SecurityStamp] AS [SecurityStamp], 
    [Extent1].[PhoneNumber] AS [PhoneNumber], 
    [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
    [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
    [Extent1].[UserName] AS [UserName] 
    FROM [dbo].[AspNetUsers] AS [Extent1] 
    WHERE [Extent1].[Id] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 
exec sp_executesql N'SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[ClaimType] AS [ClaimType], 
    [Extent1].[ClaimValue] AS [ClaimValue] 
    FROM [dbo].[AspNetUserClaims] AS [Extent1] 
    WHERE [Extent1].[UserId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2103 

上記のクエリは、結果のほんの一部です。同じクエリを複数回実行されます。これは通常のケースであるかの問題がありますか?

それが解決することができるか、問題がある場合。

+0

クエリは本当に速いですが、私の場合、私はそれがページ要求 –

+0

あたり1秒の遅延を引き起こすことを(ほとんど同じクエリが一度再び繰り返される)ので、それらの多くを持っていますあなたは私達にあなたのC#のコードの多くを示すことができますか?私はあなたのコマンドが使用されている方法を理解することはできません。たぶん、あなたは繰り返し実行中のスレッドを持っているが、それでも私は、私はあなたがより多くのいくつかのコードを記述する必要がありjambonickに同意詳細 – jambonick

+0

を必要としています。 –

答えて

1

私は「それが来るとして」あなたがアイデンティティの設定を使用していると仮定するつもりです。その場合、あなたはまた、おそらくEntity Frameworkのを使用することになります。

あなたの質問に答えるために:私の経験では、UserManagerの後ろに座っているUSERSTORE、SignInManagerなどは、アクションが実行される複数回アクセスされます。

私が気づいた主な問題は、彼らがこの場所でEntityFrameworkで信じられないほど遅いでした。私は自分のCustomUserStoreを作成した場合、それが劇的にログイン/ユーザーアクションのスピードを高速化することを発見しました。 は、複数の呼び出し方法にが、はるかに良い行いはまだあります。私の場合は

私は私の新しいUSERSTOREを駆動するためのマイクロORM Dapper.NETを使用。 DapperのはEntityFrameworkよりもはるかに高速クエリを実行することができます(一部のテストでは、クエリに応じて3-10倍高速 - 参照:https://www.exceptionnotfound.net/dapper-vs-entity-framework-vs-ado-net-performance-benchmarking/

がDapper.NET:書き換えUSERSTOREカスタムでhttps://github.com/StackExchange/Dapper

、あなたが負荷を見つけることができますここでは、オンラインではなく例のは1です:https://markjohnson.io/articles/exorcising-entity-framework-from-asp-net-identity/

+0

はdownvoteに行くが、提供EFストアが非答えであるよりもはるかに高速である理由を示すことなく、「自分のCustomUserStore」を言っていません。また、「速い」は、不正確な用語です。どのくらい速く、なぜですか? – trailmax

関連する問題