2017-06-02 2 views
0

Ich habe eine große Enterprise-Web-Anwendung, die beginnt, stark genutzt werden. Kürzlich habe ich festgestellt, dass wir viele Datenbankaufrufe für Dinge wie Benutzerberechtigungen, Zugriff, allgemeine Teile von Profilinformationen machen.Große Anwendung - Umgang mit Datenzugriff

Von dem, was ich auf Azure sehen kann, betrachten wir durchschnittlich 50.000 db Abfragen pro Stunde.

Wir verwenden Linq zur Abfrage über das DevExpress XPO ORM. Einige davon sind Joins, aber die meisten sind einfache 1 Tabellenabfragen.

Ständig schlägt die Datenbank den besten Weg, um auf diese Art von Informationen zuzugreifen? Gibt es Möglichkeiten für uns, die Datenbankarbeit zu entlasten, da sich einige dieser Informationen niemals ändern werden?

Vielen Dank im Voraus.

+1

reduzieren Ihre Frage ist weit zu breit und unspezifisch. Wir können Ihre Einstellungen nicht kennen und können daher keine Verbesserungen vorschlagen. Selbst wenn Sie diese Frage gestellt hätten, wäre diese Frage zu weit gefasst, weil es Dutzende Optimierungsmöglichkeiten gibt. Außerdem könnte es relevant sein, was Sie als "stark genutzt" und "viele db-Aufrufe" bezeichnen. Insbesondere ist es nicht Linq * oder * gespeicherte Prozedur, es könnte auch eine Ergänzung sein. Weder das eine noch das andere macht einen Unterschied, sie hängen vollständig davon ab, wie * du * sie benutzt. – HimBromBeere

+0

Danke Kumpel, sorry die Frage war zu vage. Ich habe es neu formuliert, hoffentlich ist es klarer. – bExplosion

+1

50K Abfragen pro Stunde ist nicht groß. Die Standardanleitung gilt. Gehen Sie nicht davon aus, dass die Datenbank langsam ist, sondern immer Ihr Code. Verwenden Sie geeignete Schemas und Indizes. Lade keine Sachen, die du nicht willst. Verwenden Sie das ORM nicht für Berichte. Verwenden Sie optimistische Parallelität. Verwenden Sie keine Transaktionen, weil jemand die Bedeutung von "Transaktion pro Anfrage" falsch verstanden hat. –

Antwort

2

Fangen wir damit an, dies zu relativieren. Mit 3600 Sekunden in einer Stunde haben Sie weniger als 20 Operationen pro Sekunde. Pathetisch niedrig bei jeder Messung.

Das heißt, es ist nichts falsch mit zum Beispiel Caching Benutzerberechtigungen für sagen wir 30 Sekunden oder eine Minute.

Im Allgemeinen versuchen, nicht in Ihrem Code zu cachen, aber IN FRONT - der ASP.NET-Ausgabe-Cache und Donut-Caching sind Konzepte meist ignoriert, aber immer noch am effizientesten.

http://www.dotnettricks.com/learn/mvc/donut-caching-and-donut-hole-caching-with-aspnet-mvc-4

hat weitere Informationen. Dann ignoriere alle großen Zahlen und führe einen Profiler aus - sieh dir an, was deine wahren Schwergewichte sind (wahrscheinlich in der Nähe von Berechtigungen, da diese auf jeder Seite verwendet werden). Setzen Sie das in ein Subsystem und cachen Sie dies. Vorausgesetzt, dass Sie das in Benutzeridentitätsobjekt im asp.net-Subsystem laden können - Ihr Code sollte die Datenbank in den Seiten trotzdem nicht treffen, daher ist der Cache in einigen Filtern in asp.net isoliert.

Messen. Stellen Sie sicher, dass Ihr SQL intelligent ist - EF und LINQ führen zu extrem idiotischem SQL, weil die Leute zu faul sind. Vermeiden Sie die Instanziierung kompletter Objekte, nur um sie wegzuwerfen, fragen Sie nur nach den Feldern, die Sie benötigen. Stellen Sie sicher, dass Ihre Indizes effizient sind. Komm zurück, wenn du ein echtes Problem hast (gemessen).

Aber die alte Regel lautet: Cache früh. Und die LINQ-Optimierung ist ziemlich weit hinten.

+0

Die Erwähnung von LINQ und Joins in der Frage deutet darauf hin, dass es bereits Probleme mit dem ORM gibt Aufbau. Ich würde auch hinzufügen: "Benutze keine Transaktionen, weil du denkst, dass optimistische Parallelität schwierig ist" und "Vergiss die Transaktion pro Anfrage, es bedeutete nicht Datenbanktransaktionen". Diese beiden sind genug, um schlecht geschriebene ORM-Code verhalten Größenordnungen schlechter als VB6 und ADO-Code –

+0

machen nur eine schnelle Änderung der Frage, wir verwenden nicht wirklich Transaktionen. Ich habe das falsche Wort benutzt :) – bExplosion

+0

Danke Tom, ich werde das zusammen mit dem Profiling untersuchen. – bExplosion

0

Um benutzerspezifische Informationen wie Profil, Zugriff usw. aus der Datenbank zu erhalten, ist es besser, die Informationen einmal bei der Anmeldung zu erhalten, anstatt sie für jede Anfrage abzurufen. Dies sollte Ihre Transaktionen mit der Datenbank