Ich habe diese Abfrage, die in einer Produktionsumgebung sehr langsam ist. Ich würde gerne wissen, warum und ob es einen besseren Weg gibt, das gleiche Ergebnis zu erzielen.Warum ist meine Linq zu SQL-Abfrage sehr langsam?
public async Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email)
{
return await (from m in this.Queryable()
where m.Email == email
&& (m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL1ID)
|| m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL3ID)
|| m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL4ID))
select m).SingleOrDefaultAsync();
}
Kurz gesagt, der Zweck dieser Abfrage besteht darin, eine Benutzermitgliedschaft per E-Mail zu erhalten und mit einem Login fortzufahren. Mehr habe ich Benutzermitgliedschaften, mehr diese Abfrage wird langsam sein.
Danke,
David
bearbeiten
this.Queryable()
das Äquivalent ist select * from Memberships
zu tun. Membership
Tabelle hat viele Rollen, und eine Rolle hat viele Mitgliedschaften.
Auch Mitgliedschaft Tabelle dauert bis zu 12 Sekunden, um die Login-Informationen für 240 Zeilen zu erhalten. Ich muss nach der Rolle filtern, weil der E-Mail-Wert im System nicht eindeutig ist. Nur einige Rollen haben Zugriff auf die Anmeldung und diese Rollen haben eindeutige E-Mails. Deshalb muss ich filtern. Diese Abfrage gibt eine Mitgliedschaft zurück, um mit der Anmeldung fortzufahren, die mit der obigen Abfrage ausgewählt wurde. Also keine IQueryable
, IEnumerable
oder List
, nur der SingleOrDefault
Wert.
'this.Queryable()' ??? Du gibst nicht viele Informationen .. Was ist 'das'? Was gibt die 'Queryable()' Methode zurück? Zeigen Sie diesen Code? – user3185569
Sorry! Der Code befindet sich in einer Repository-Architektur. Ich habe mehr Informationen im Abschnitt Bearbeiten gegeben. –
Wir müssten wahrscheinlich die SQL-Tabellendefinitionen zusammen mit irgendwelchen Indizes sehen. – RBarryYoung