2012-04-15 7 views
1

ASP.NET MVC 3アプリケーション用のカスタム管理ページを作成していますが、これはユーザーをaspnet "アプリケーションサービス"データベースから取得するのに驚いています。ASP.NETメンバーシップデータベースとパフォーマンス

組み込みのMembership.GetAllUsers()メソッドは非常に遅いですが、ユーザーごとに大量の情報を取得するため、当然です。私たちはそれほど必要ではありませんので、私たちはaspnet dbの上にSQLレイヤーにLINQを投げ、LINQを使って独自のクエリを書くことにしました。

結果は改善されましたが、標準メソッドで120人を超えるビットをフェッチするのに約30秒かかっています。私たちのカスタムクエリでは9秒でした。

150行の9秒が巨大に見えます。どのようなアイデアがなぜそれほど長くかかるのですか?

EDITはここで何かを返すように9秒かかる方法の一例です:

public static List<LightMembershipUser> GetUsersInRole(string roleName) { 
     //Find the role 
     var roleId = (from role in db.Roles 
         where roleName == role.RoleName 
         select role.RoleId) 
         .First(); 
     if (roleId==null){ return null; } 

     var res = from u in db.Users 
        join ur in db.UsersInRoles on u.UserId equals ur.UserId 
        join m in db.Memberships on u.UserId equals m.UserId 
        where ur.RoleId==roleId 
        select new LightMembershipUser { UserName = u.UserName, CreationDate = m.CreateDate, Email = m.Email, Roles = Roles.GetRolesForUser(u.UserName) }; 
     return res.ToList(); 
    } 
+0

コールドスタートまたは既に実行されているアプリケーションプールから測定しましたか? – jgauffin

+0

@jgauffin:しました。 – guidupuy

+1

このRails = Roles.GetRolesForUser(u.UserName)というビットは、Mystere Manのように150のクエリを実行していることを意味していませんか?あなたはSQLを見たことがありますか? –

答えて

1

メンバーシップシステム特有のもので、アクセスが遅くなるものは何もなく、30秒で120人のユーザーが典型的なものではありません。メンバーシップはデータベース内のテーブルの集合に過ぎず、そうしない限り別個のデータベースではありません。それらは単なる行です。

明らかにデータベースサーバーに問題があります。低速のサーバーでも、マイクロ秒で150行を返すことができるはずです。あなたはあなたの質問にあなたの質問を含めることを試みるかもしれません、それはおそらくあなたが間違っていることです。

待ち時間が150回ですか?または150レコードを返す1つのクエリ?明らかに、メンバーシップAPIは一度に複数のユーザーを返す方法を提供しないため、メンバーシップを使用している場合は、150人のユーザーを取得するために150のクエリを実行する必要があります。しかし、あなた自身のクエリは、好きなだけ多くの行を処理できるはずです。

+0

それを考え出した。その 'Roles = Roles.GetRolesForUser(u.UserName)'呼び出しは、見つかったレコードごとに個別のデータベースクエリをトリガーします。そう、ええ、私は最後に150の質問をしています。愚かな私。 – guidupuy

-1

私はあなたではなく、独自のデータベースとあなたのクラスを作る、全くASPNETデータベースを使用しないことをお勧めしていますMembershipProviderおよびRoleProviderを拡張します。

あなたはあなたの質問を提供できますか?

関連する問題