2012-04-15 13 views
1

Wir schreiben eine benutzerdefinierte Admin-Seite für unsere ASP.NET MVC 3-App und wir sind überrascht, wie lange es dauert, Benutzer aus der Aspnet "Application Services" -Datenbank zu greifen.ASP.NET-Mitgliedschaftsdatenbank und Leistung

Die integrierte Membership.GetAllUsers() -Methode ist mühsam langsam, aber verständlich, da es eine große Menge an Informationen für jeden Benutzer abruft. Wir brauchen nicht viel, also entschieden wir uns, eine LINQ-SQL-Schicht über unsere aspnet db zu werfen und unsere eigenen Abfragen mit LINQ zu schreiben. Anstatt alles abzurufen, erhalten wir nur ein paar Spalten - die einzigen, an denen wir interessiert sind.

Die Ergebnisse sind besser, aber immer noch: Es dauert etwa 30 Sekunden, um etwas mehr als 120 Benutzer mit der Standardmethode zu holen im Vergleich zu 9 Sekunden mit unserer benutzerdefinierten Abfrage.

9 Sekunden für 150 Zeilen scheint riesig. Irgendeine Idee, warum es so lange dauert?

EDIT Hier ist ein Beispiel für ein Verfahren, das 9 Sekunden dauert etwas zurück:

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

Haben Sie an einem Kaltstart oder einem bereits laufenden App-Pool gemessen? – jgauffin

+0

@jgauffin: Ich habe. – guidupuy

+1

Bedeutet dieses Bit 'Roles = Roles.GetRolesForUser (u.UserName) ', dass Sie 150 Abfragen durchführen, wie Mystere Man vorgeschlagen? Hast du dir das SQL angesehen? –

Antwort

1

Es gibt keine spezifischen Elemente im Membership-System, die einen langsamen Zugriff verursachen würden. Ihre 120 Benutzer in 30 Sekunden sollten nicht typisch sein. Die Mitgliedschaft besteht nur aus einer Reihe von Tabellen in der Datenbank, sie sind nicht einmal eine separate Datenbank, es sei denn, Sie richten sie so ein. Sie sind nur Reihen.

Es ist offensichtlich etwas falsch mit Ihrem Datenbankserver. Sie sollten 150 Zeilen in Mikrosekunden auch auf einem langsamen Server zurückgeben können. Sie könnten versuchen, Ihre Frage in Ihre Frage aufzunehmen, da es vielleicht etwas ist, was Sie falsch machen.

Warten .. machst du 150 Abfragen? Oder eine Abfrage, die 150 Datensätze zurückgibt? Offensichtlich bietet die Membership-API keine Möglichkeit, mehrere Benutzer gleichzeitig zurückzugeben. Wenn Sie also Membership verwenden, müssen Sie 150 Abfragen durchführen, um 150 Benutzer zu erhalten. Aber Ihre eigenen Abfragen sollten in der Lage sein, so viele Zeilen zu bearbeiten, wie Sie möchten.

+0

Ich habe es herausgefunden. Der Aufruf 'Roles = Roles.GetRolesForUser (u.UserName)' löst für jeden gefundenen Datensatz eine individuelle Datenbankabfrage aus. Also, ich mache am Ende 150 Suchanfragen. Ich Idiot. – guidupuy

-1

ich, dass Sie nicht empfohlen aspnet Datenbank verwenden überhaupt, sondern machen Sie Ihre eigene Datenbank und Ihre Klassen, Erweitern MembershipProvider und RoleProvider.

Können Sie Ihre Anfrage stellen?