Wann eine Abfrage oder ein Code verwendet werden soll [geschlossen]

7

Ich frage nach einem konkreten Fall für Java + JPA / Hibernate + Mysql, aber ich denke, dass Sie diese Frage auf eine große Anzahl von Sprachen anwenden können.

Manchmal muss ich eine Abfrage in einer Datenbank durchführen, um einige Entitäten wie Mitarbeiter zu erhalten. Nehmen wir an, Sie benötigen bestimmte Mitarbeiter (diejenigen mit 'John' als Vornamen). Würden Sie lieber genau diese Menge von Mitarbeitern abfragen oder möchten Sie lieber nach allen Mitarbeitern suchen und dann eine Programmiersprache zum Abrufen verwenden? Die, an denen Sie interessiert sind? warum (Leichtigkeit, Effizienz)? Was ist (im Allgemeinen) effizienter?

Ist ein Ansatz besser als der andere abhängig von der Tabellengröße?

Betrachtet:

  • Gleiche Komplexität, Wiederverwendbarkeit in beiden Fällen.
dgmora 12.12.2012, 15:41
quelle

7 Antworten

4

Es gibt einen allgemeinen Trick, der oft bei der Programmierung verwendet wird - das Bezahlen mit Speicher zur Beschleunigung des Betriebs. Wenn Sie viele Mitarbeiter haben und einen beträchtlichen Teil von ihnen abfragen, wird einer nach dem anderen (sagen wir, 75% werden zu einem bestimmten Zeitpunkt abgefragt), dann fragen Sie alles ab, cachen Sie es (sehr wichtig!), und vervollständigen Sie die Suche im Speicher. Wenn Sie das nächste Mal abfragen, überspringen Sie die Reise zu RDBMS, gehen Sie direkt zum Cache und machen Sie eine schnelle Suche: Ein Roundtrip zu einer Datenbank ist sehr teuer im Vergleich zu einer In-Memory-Hash-Suche.

Wenn Sie andererseits auf einen kleinen Teil der Mitarbeiter zugreifen, sollten Sie nur einen Mitarbeiter abfragen: Die Datenübertragung vom RDBMS zu Ihrem Programm erfordert viel Zeit, viel Netzwerkbandbreite und viel Speicher Ihre Seite und viel Speicher auf der RDBMS-Seite. Das Abfragen von vielen Zeilen, die alle bis auf einen wegwerfen, macht keinen Sinn.

    
dasblinkenlight 12.12.2012, 15:52
quelle
10

Führen Sie die Abfrage immer in der Datenbank aus. Wenn Sie nicht mehr Daten auf den Client kopieren müssen, werden auch Datenbanken geschrieben, um effizient Daten zu filtern, die mit hoher Wahrscheinlichkeit effizienter sind als Ihr Code.

Die einzige Ausnahme, die ich mir vorstellen kann, ist, wenn die Filterbedingung rechenintensiv ist und Sie die Berechnung über mehr CPU-Leistung als die Datenbank verteilen können.

In den Fällen, in denen ich eine Datenbank hatte, hatte der Server mehr CPU-Leistung als die Clients. Wenn nicht überlastet, wird die Abfrage nur für die gleiche Menge Code schneller ausgeführt.

Sie müssen auch weniger Code schreiben, um die Abfrage in der Datenbank mithilfe der Hibernates-Abfragesprache durchzuführen, anstatt Code schreiben zu müssen, um die Daten auf dem Client zu bearbeiten. Hibernate-Abfragen verwenden auch Client-Caching in der Konfiguration, ohne dass Sie mehr Code schreiben müssen.

    
Mark 12.12.2012 15:45
quelle
4

Im Allgemeinen würde ich der Datenbank erlauben, welche Datenbanken gut sind. Filtern von Daten ist etwas, was Datenbanken wirklich gut sind, so dass es am besten dort gelassen werden sollte.

Das heißt, es gibt einige Situationen, in denen Sie vielleicht nur alle von ihnen greifen und die Filterung in Code durchführen möchten. Eine, die ich mir vorstellen kann, wäre, wenn die Anzahl der Zeilen relativ klein ist und Sie planen, sie in Ihrer App zwischenzuspeichern. In diesem Fall würden Sie einfach alle Zeilen nachschlagen, sie zwischenspeichern und anschließend mit dem filtern, was Sie im Cache haben.

    
Eric Petroelje 12.12.2012 15:47
quelle
2

Es ist situationsbedingt. Ich denke, im Allgemeinen ist es besser, sql zu verwenden, um die genaue Ergebnismenge zu erhalten.

Das Problem beim Laden aller Entitäten und der programmgesteuerten Suche besteht darin, dass Sie alle Entitäten laden müssen, die sehr viel Speicher benötigen. Zusätzlich müssen Sie dann alle Entitäten durchsuchen. Warum tun Sie das, wenn Sie Ihr RDBMS nutzen und die gewünschten Ergebnisse erzielen können? Mit anderen Worten, warum sollten Sie ein großes Dataset laden, das zu viel Arbeitsspeicher benötigt, und es dann verarbeiten, wenn Sie Ihr RDBMS für sich arbeiten lassen können?

Wenn Sie andererseits wissen, dass die Größe Ihres Datasets nicht zu groß ist, können Sie sie in den Speicher laden und abfragen. Dies hat den Vorteil, dass Sie nicht zum RDBMS gehen müssen Je nach Systemarchitektur müssen Sie möglicherweise nicht über Ihr Netzwerk gehen.

Aber selbst dann können Sie verschiedene Caching-Dienstprogramme verwenden, so dass die allgemeinen Abfrageergebnisse zwischengespeichert werden. Dadurch entfällt der Vorteil, dass Sie die Daten selbst zwischenspeichern.

    
hvgotcodes 12.12.2012 15:45
quelle
2

Denken Sie daran, dass Ihr Ansatz im Laufe der Zeit skalieren sollte. Was ein kleiner Datensatz sein könnte, könnte später im Laufe der Zeit zu einem riesigen Datensatz werden. Wir hatten ein Problem mit einem Programmierer, der die Anwendung so programmiert hat, dass sie die gesamte Tabelle abfragt und dann Manipulationen daran ausführt. Der Ansatz funktionierte gut, wenn es nur 100 Zeilen mit zwei Subselects gab, aber als die Daten im Laufe der Jahre zunahmen, wurden die Leistungsprobleme offensichtlich. Das Einfügen eines Datumsfilters, um nur die letzten 365 Tage abzufragen, könnte Ihrer Anwendung dabei helfen, besser zu skalieren.

    
Sun 12.12.2012 17:18
quelle
1

- Wenn Sie nach einer Antwort suchen, die für den Ruhezustand spezifisch ist, aktivieren Sie @ Marks Antwort

Angesichts des Beispiels für Mitarbeiter: Wenn die Anzahl der Mitarbeiter im Laufe der Zeit skaliert werden kann, ist es besser, einen Ansatz zu verwenden, um die Datenbank nach den genauen Daten abzufragen. Wenn Sie sich jedoch für etwas wie Department (zum Beispiel) interessieren, bei dem die Wahrscheinlichkeit eines schnellen Wachstums der Daten geringer ist, ist es nützlich, alle abzufragen und sich im Speicher zu halten - auf diese Weise müssen Sie nicht nach außen gelangen Ressource (Datenbank) jedes Mal, was teuer sein könnte.

Also sind die allgemeinen Parameter diese,

  1. Skalierung von Daten
  2. Kritikalität zu Business
  3. Datenvolumen
  4. Nutzungshäufigkeit

um etwas Sinn zu machen, wenn die Daten nicht häufig skaliert werden und die Daten nicht geschäftskritisch sind und das Datenvolumen im Speicher auf dem Anwendungsserver verwaltet werden kann und häufig verwendet wird - alles mitbringen und sie programmatisch filtern, wenn benötigt.

wenn sonst nur bestimmte Daten erhalten.

    
humblelistener 12.12.2012 18:16
quelle
1

Was ist besser: viel zu Hause zu lagern oder es nach und nach zu kaufen? Wenn du viel reist? Nur als Gastgeber einer Party? Es kommt darauf an, nicht? In ähnlicher Weise ist der beste Ansatz eine Frage der Leistungsoptimierung. Das beinhaltet eine Menge Variablen. Die Kunst besteht darin, zu verhindern, dass Sie sich selbst in eine Ecke malen, wenn Sie Ihre Lösung entwerfen und später optimieren, wenn Sie Ihre tatsächlichen Engpässe kennen. Ein guter Ausgangspunkt ist hier: en.wikipedia.org/wiki/Performance_tuning Ein Gedanke könnte mehr oder weniger allgemein hilfreich sein: kapseln Sie Ihren Datenzugriff gut ein.

    
full.stack.ex 16.12.2012 16:49
quelle

Tags und Links