2012-12-12 11 views
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.Wann verwende ich eine Abfrage oder Code

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 eine Methode besser als die andere abhängig von der Tabellengröße?

Betrachtet:

  • Gleiche Komplexität, Wiederverwertbarkeit in beiden Fällen.
+4

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: http://en.wikipedia.org/wiki/Performance_tuning Ein Gedanke könnte mehr oder weniger universell hilfreich sein: kapseln Sie Ihren Datenzugriff gut ein. –

+0

Ich würde sagen, Ihre Antwort ist wirklich diejenige, die Sie am meisten lernen können! – dgmora

+0

@ dgarcia, danke. Ich werbe es in eine Antwort für den Fall, dass Sie eine akzeptieren möchten. –

Antwort

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 Sie werden einen beträchtlichen Teil von ihnen abfragen, eins nach dem anderen (sagen wir, 75% werden einmal abgefragt), dann alles abfragen, cache es (sehr wichtig!), und vervollständigen Sie die Suche im Speicher. Wenn Sie das nächste Mal abfragen, überspringen Sie die Reise nach RDBMS, gehen Sie direkt zum Cache und machen Sie eine schnelle Suche: Ein Roundtrip zu einer Datenbank ist sehr teuer im Vergleich zu einem In-Memory-Hash-Lookup.

Auf der anderen Seite, wenn Sie auf einen kleinen Teil der Mitarbeiter zugreifen, sollten Sie nur einen Mitarbeiter abfragen: Datenübertragung vom RDBMS zu Ihrem Programm braucht viel Zeit, viel Netzwerk-Bandbreite, viel Speicher auf Ihrer Seite und viel Speicher auf der RDBMS-Seite. Abfragen von vielen Zeilen, um alle bis auf einen wegzuwerfen, macht keinen Sinn.

10

Führen Sie immer die Abfrage 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 denken 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.

Außerdem müssen Sie weniger Code schreiben, um die Abfrage in der Datenbank mithilfe der Hibernate-Abfragesprache auszufü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.

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 Abhängig von Ihrer Systemarchitektur müssen Sie möglicherweise nicht über Ihr Netzwerk gehen.

Aber auch dann können Sie verschiedene Caching-Dienstprogramme verwenden, damit die allgemeinen Abfrageergebnisse zwischengespeichert werden, wodurch der Vorteil der Zwischenspeicherung der Daten entfällt.

4

Im Allgemeinen würde ich die Datenbank machen lassen, welche Datenbanken gut sind. Filtern von Daten ist etwas, was Datenbanken wirklich gut sind, so dass es am besten dort bleiben würde.

Das heißt, es gibt einige Situationen, wo Sie nur alle von ihnen greifen und die Filterung in Code tun 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 filtern, was Sie im Cache haben.

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. Wenn Sie nur einen Datumsfilter einfügen, um nur die letzten 365 Tage abzufragen, kann Ihre Anwendung besser skalieren.

1

- wenn Sie eine Antwort spezifisch für den Ruhezustand suchen, lesen @ Mark Antwort

die Mitarbeiter Beispiel -assuming die Zahl der Mitarbeiter Angesichts der Zeit skalieren, es besser ist, einen Ansatz zu verwenden, die zur Abfrage Datenbank für die genauen Daten. Wenn Sie jedoch etwas wie Department (zum Beispiel) in Betracht ziehen, wo die Wahrscheinlichkeit, dass die Daten schnell wachsen, geringer ist, ist es nützlich, alle abzufragen und im Speicher zu haben - auf diese Weise müssen Sie nicht auf die externe Ressource (Datenbank) jedes Mal, was kostspielig sein könnte.

So sind die allgemeinen Parameter sind diese,

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

einen Sinn zu setzen, wenn Die Daten werden nicht häufig skaliert, und die Daten sind nicht geschäftskritisch, und das Datenvolumen kann im Speicher auf dem Bildschirm verwaltet werden pplication Server und wird häufig verwendet - Bring alles mit und filtere sie bei Bedarf programmatisch.

wenn sonst nur bestimmte Daten erhalten.

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.

+0

Ich habe es nicht als Antwort gewählt, weil es nicht direkt das Hauptthema "beantwortet", obwohl ich denke, dass es ziemlich nützlich ist – dgmora

Verwandte Themen