1

ASP.NET MVC 3 アプリのカスタム管理ページを作成していますが、aspnet の「アプリケーション サービス」データベースからユーザーを取得するのにどれだけの時間がかかるかに驚いています。

組み込みの Membership.GetAllUsers() メソッドは非常に遅いですが、ユーザーごとに大量の情報を取得するため、当然のことです。それほど多くは必要ないので、aspnet db の上に LINQ to SQL レイヤーを配置し、LINQ を使用して独自のクエリを作成することにしました。すべてを取得する代わりに、関心のある列のみを取得します。  

結果は良くなりましたが、標準の方法で 120 人を少し超えるユーザーを取得するのに約 30 秒かかりましたが、カスタム クエリでは 9 秒かかりました。

150 行で 9 秒は巨大に思えます。なぜそんなに時間がかかるのですか?

編集何かを返すのに 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();
    }
4

2 に答える 2

1

メンバーシップ システムに固有の理由でアクセスが遅くなることはありません。30 秒で 120 人のユーザーがいるというのは、一般的なことではありません。メンバーシップはデータベース内の一連のテーブルにすぎません。そのように設定しない限り、それらは別個のデータベースではありません。それらは単なる行です。

データベース サーバーに明らかに問題があります。遅いサーバーでも、マイクロ秒で 150 行を返すことができるはずです。ただし、間違っている可能性があるため、質問にクエリを含めてみてください。

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

于 2012-04-15T21:26:43.790 に答える
-1

aspnet データベースをまったく使用しないことをお勧めします。独自のデータベースと、 および を拡張するクラスを作成することをお勧めしMembershipProviderますRoleProvider

クエリを提供できますか?

于 2012-04-15T19:08:13.247 に答える