Dies ist eine Diskussion, die ich selbst und einige meiner Kollegen führen, und ich denke, ich komme hierher, um zu sehen, was passiert, wenn ein allgemeiner Konsens darüber besteht.
Grundsätzlich ergeben sich die folgenden 2 Meinungen zu Datenbankaufrufen: 1. Führen Sie einen großen Aufruf durch, um alles zu erhalten, was zur Reduzierung der Anzahl der Datenbankaufrufe erforderlich ist. 2. Führen Sie kleinere separate Aufrufe aus, je nachdem, was zur Reduzierung der Größe erforderlich ist DB ruft auf
Wo dies besonders ins Spiel kommt, ist allgemeiner Code. Wir werden das Beispiel einer Employee-Klasse verwenden, da dies ziemlich einfach ist.
Angenommen, Ihre Employee-Klasse verfügt über 10 Werteattribute (Vorname, Nachname, Angestellter usw.) und dann über 2 Klassenattribute. 1 verweist auf eine Department-Klasse und 1 Supervisor, der auf ein anderes Employee-Objekt verweist.
In Mindset 1 würden Sie einen Anruf tätigen, der die Mitarbeiterdaten sowie die Felder zurückgibt, die zum Auffüllen der Abteilungs- und Vorgesetztenattribute erforderlich sind, oder zumindest die Felder, die am häufigsten von diesen Unterobjekten verwendet werden.
In Mindset 2 sollten Sie zuerst nur das Employee-Objekt und dann nur die Department- und Supervisor-Objekte auffüllen, wenn sie tatsächlich angefordert werden.
Die Haltung von 2 ist ziemlich einfach ... minimieren Sie die Größe der Anforderungen und die Anzahl der Datenbankobjekte, die bei jeder Anforderung getroffen werden müssen. # 1 ist der Meinung, dass selbst wenn es richtig implementiert werden könnte, die bloße Tatsache, dass der Code mehrere Verbindungen herstellen müsste, die Verbindung zwischen dem Webserver und der Datenbank mehr belasten wird, als sie zu reduzieren.
Die treibende Kraft hinter dieser Untersuchung ist, dass der Datenverkehr zwischen unserem Webserver und dem Datenbankserver außer Kontrolle gerät.
quelle
Antworten:
Wenn die treibende Kraft hinter dieser Frage zu viel Verkehr ist, haben Sie sich mit dem Zwischenspeichern häufig verwendeter Objekte befasst? Beispiel: Nachdem Sie die Objekte "Employee", "Department" und "Supervisor" erhalten haben, ist es möglicherweise eine gute Idee, ihnen einen Cache hinzuzufügen, damit sie sich bereits im Cache befinden und nicht abgerufen werden müssen, wenn sie in naher Zukunft erneut angefordert werden nochmal. Natürlich muss der Cache selten verwendete Objekte auslaufen lassen und Objekte entfernen können, die von der Anwendung geändert und wieder in der Datenbank gespeichert wurden.
Je nachdem, welche Sprache und Frameworks Sie verwenden, gibt es möglicherweise bereits ein Caching-Framework, das einige (oder die meisten) der von Ihnen benötigten Funktionen ausführen kann. Wenn Sie Java verwenden, können Sie in den Apache Commons-Cache schauen (ich habe ihn eine Weile nicht mehr verwendet, und obwohl er ruhend aussieht, ist er immer noch verfügbar und beim letzten Mal ziemlich anständig).
quelle
Achten Sie immer auf Lesbarkeit und Klarheit, wenn Sie zum ersten Mal etwas schreiben. Sie können dann bei Bedarf umgestalten. Führen Sie Lasttests durch, um die Engpässe zu ermitteln. In vielen Fällen ist dies nicht die Anzahl der Anrufe, die das Problem verursachen, sondern die Anzahl der schlecht geschriebenen Anrufe.
Was als zu viele klassifiziert wird, hängt von der Anwendung ab. Für die meisten Webanwendungen ist alles unter 30 Sekunden annehmbar. Ich würde mit Ihren Nutzern über deren Erwartungen sprechen.
quelle
Ihre Frage scheint auf der Annahme zu beruhen, dass Sie raten müssen, welche Daten für eine bestimmte Seite benötigt werden. Das ist nicht der Fall. Es ist nicht so einfach wie der naive Ansatz, aber Sie können Ihren Code so gestalten, dass Sie wissen, ob Sie Abteilungs- oder Supervisor-Attribute benötigen, bevor Sie Datenbankaufrufe durchführen.
quelle
Dies sind die Regeln, die ich verwende. Vielleicht helfen sie Ihnen.
quelle
Beide Strategien sind hier vollkommen gültig. Jeder hat Vor- und Nachteile:
Ein Aufruf für alle 3 Objekte:
Ein Anruf pro Objekt (3 Anrufe insgesamt)
quelle
Zu viele DB-Anforderungen stellen für mich mehr Anforderungen, als Sie zum Laden der jeweils benötigten Daten benötigen.
Wenn Sie die Daten nicht benötigen, verschwenden Sie keinen Speicher, um eine spätere zweite Auslösung zu vermeiden. Wenn Sie jedoch die Datenmenge benötigen, sollten Sie die Aufrufe der Datenbank minimieren.
Also haben Sie beide Möglichkeiten und nutzen Sie jede, wo es die Situation erfordert.
EDIT: Denken Sie daran, dass dies natürlich auch von Ihrer Situation abhängt. Wenn es sich zum Beispiel um eine WebApp handelt, sollten Sie andere Überlegungen anstellen, als wenn es sich um eine Desktop-App handelt, die auf die Datenbank in Ihrem Netzwerk zugreift, und nicht über das Internet für die WepApp.
quelle
Stellen Sie eine Verbindung zur Datenbank her, senden Sie eine Anfrage und lassen Sie sie analysieren. Dies dauert in der Regel erheblich länger als das Abrufen von Ergebnissen. Daher besteht der allgemeine Trend darin, so viele Abfragen wie möglich in einer Anfrage zusammenzufassen.
Wenn Sie dies alles auf einmal tun, ist der Code nicht mehr zu warten. Stattdessen wird dies normalerweise durch eine zusätzliche Abstraktionsschicht erreicht: Der Code plant mehrere Anforderungen nach Bedarf, dann analysiert die Engine diese als eine große Anforderung (möglicherweise unter Verwendung des Caches unterwegs) und sendet die Antworten nach Bedarf.
Natürlich können nicht immer alle in einer Abfrage abgerufen werden - häufig wird eine Abfrage erstellt, die die für die Erstellung der nächsten Abfrage erforderlichen Daten enthält, sodass Sie diese wiederholen müssen. Immer noch mehrere Anfragen gleichzeitig zu bearbeiten, ist besser als hunderte kleine Schüsse in die Datenbank.
Planen Sie also, was Sie benötigen, fordern Sie es an und rufen Sie es ab. Wenn mehr erforderlich ist, fordern Sie es an und rufen Sie es erneut ab, und verwenden Sie die Daten dann zum Generieren von Inhalten. Vermeiden Sie auf jeden Fall Datenbankanforderungen wie die Initialisierung lokaler Variablen, die über den gesamten Code verteilt sind.
quelle
Wir wissen nicht genug über Ihre Anwendung, um zu wissen, welche Auswahl Sie zu früh optimieren müssen. Wie oft werden die Supervisor-Daten verwendet? Scheint als könnte es eine Verschwendung sein, aber wir wissen es nicht. Wenn Sie sie getrennt halten, können Sie möglicherweise Ihr System überwachen, um festzustellen, wie oft sie gemeinsam verwendet werden. Dann können Sie die Entscheidung treffen, sie einfach in einem Anruf zu kombinieren. Ansonsten, wenn Sie mit diesem einen großen Aufruf beginnen, einen Flaschenhals zu kreieren, wo fangen Sie an, Probleme zu beheben? Schwer zu identifizieren, was Sinn macht, wegzulassen. Weitere Datenfelder können zu diesem Prozess hinzugefügt werden.
Es wäre interessant zu wissen, wie viel davon von db memory vs disk kommt. Ich habe nicht das Gefühl, dass sich die Abteilung im Vergleich zur Adresse mehr oder weniger wahrscheinlich ändert.
quelle