Joins sind für faule Leute?

169

Ich hatte kürzlich eine Diskussion mit einem anderen Entwickler, der mir behauptete, dass JOINs (SQL) nutzlos sind. Dies ist technisch richtig, aber er fügte hinzu, dass die Verwendung von Joins weniger effizient ist als das Erstellen mehrerer Anforderungen und Verknüpfungstabellen im Code (C # oder Java).

Für ihn sind Joins für faule Leute, denen Leistung egal ist. Ist das wahr? Sollten wir die Verwendung von Joins vermeiden?

Bastien Vandamme
quelle
114
Nein. Datenbanken sind für die Durchführung von Verknüpfungen optimiert. Sie sind besonders für große Datenmengen extrem schnell. Sie möchten nicht, dass Ihre Anwendung Zehntausende Zeilen lädt und sie manuell zusammenführt.
Halfdan
91
Programmiersprachen sind für faule Leute; Sie sind weniger effizient als das manuelle Codieren von CPU-Anweisungen. :)
Michael McGowan
76
Wie heißt der Entwickler? Ich möchte sicherstellen, dass ich ihn nie anheuere.
Joe
39
@ Michael meh, echte Programmierer verwenden Schmetterlinge ...
Marc Gravell
14
Bezüglich Ihres "das ist wahr" - nein, ist es nicht. Datenbanken arbeiten über die Mengenlehre; Joins am Set arbeiten sehr gut und nützlich ...
Marc Gravell

Antworten:

188

Nein, wir sollten Entwickler vermeiden, die solch unglaublich falsche Meinungen vertreten.

In vielen Fällen ist ein Datenbank-Join mehrere Größenordnungen schneller als alles, was über den Client ausgeführt wird, da DB-Roundtrips vermieden werden und der DB Indizes verwenden kann, um den Join durchzuführen.

Ich kann mir nicht einmal ein einziges Szenario vorstellen, in dem ein korrekt verwendeter Join langsamer wäre als der entsprechende clientseitige Vorgang.

Bearbeiten: Es gibt einige seltene Fälle, in denen benutzerdefinierter Clientcode effizienter arbeiten kann als ein einfacher DB-Join (siehe Kommentar von meriton). Dies ist jedoch eine Ausnahme.

Michael Borgwardt
quelle
1
Was ist mit 3-Wege-Verbindungen? Gibt es nicht Fälle, in denen Sie besser dran wären, sie "im Code" zu machen?
julien_c
56
Das Beitreten zum App-Server kann effizienter sein, wenn das Beitreten zur Datenbank zu schwerwiegenden Redundanzen in der über das Netzwerk gesendeten Ergebnismenge führt. Betrachten Sie die Tabellen A und B, in denen jede Zeile in A 20 Zeilen in B zugeordnet ist, B nur 100 Zeilen hat und wir die ersten 1000 Zeilen von A mit den zugehörigen Zeilen von B abrufen möchten. Der Beitritt zur Datenbank führt zu 20 * 1000 Tupel, die über das Netzwerk gesendet werden. Wenn der Join auf dem App-Server erfolgt (zuerst wird die gesamte B-Tabelle in den Speicher abgerufen), werden lediglich 100 + 1000 Zeilen über das Netzwerk gesendet.
Meriton
7
Sie haben jedoch sicherlich Recht, da Verknüpfungen in der Datenbank in den meisten Fällen viel schneller sind und daher nicht nur eine Frage der Bequemlichkeit, sondern auch der Notwendigkeit sind.
Meriton
13
Ich hatte das Glück, mit einigen Entwicklern zu sprechen, die bei Microsoft an SQL Server arbeiten. Es wird Ihnen schwindelig, die Optimierungen zu hören, die sie bei Abfragen vornehmen. Wer glaubt, schlauer zu sein, muss geschlagen werden.
Riwalk
2
@meriton Ich bin ein wenig überrascht; Ich würde erwarten, dass die Client-Bibliothek Cross-Joins optimiert.
Phil Lello
83

Für mich klingt es so, als würde Ihr Kollege mit einer No-SQL-Dokumentendatenbank oder einem Schlüsselwertspeicher gut zurechtkommen. Welches sind selbst sehr gute Werkzeuge und eine gute Passform für viele Probleme.

Eine relationale Datenbank ist jedoch stark für die Arbeit mit Mengen optimiert. Es gibt viele, viele Möglichkeiten, die Daten basierend auf Joins abzufragen , die weitaus effizienter sind als viele Roundtrips. Hier kommt die Vielseitigkeit eines rdbms her. Sie können dasselbe auch in einem NOSQL-Speicher erreichen, aber am Ende erstellen Sie häufig eine separate Struktur, die für jede unterschiedliche Art von Abfrage geeignet ist.

Kurzum: Ich bin anderer Meinung. In einem RDBMS sind Verknüpfungen von grundlegender Bedeutung . Wenn Sie sie nicht verwenden, verwenden Sie sie nicht als RDBMS.

Marc Gravell
quelle
46

Nun, er ist im allgemeinen Fall falsch.

Datenbanken können mithilfe einer Vielzahl von Methoden optimiert werden, die durch Optimierungshinweise, Tabellenindizes, Fremdschlüsselbeziehungen und möglicherweise andere herstellerspezifische Informationen für Datenbanken unterstützt werden.

sehe sehen
quelle
1
Ich muss zugeben, als ich anfing, mit Datenbanken zu arbeiten, war ich der gleichen Überzeugung, dass ich die Leistung von Joins übertreffen könnte. Es dauerte jedoch nicht lange, bis klar wurde, wie erstaunlich schnell Joins von der DB durchgeführt werden. In dieser Situation würde ich sogar sagen, dass es besser ist, dies offen mit dem Mitarbeiter zu besprechen, als ihn als Idioten zu entlassen.
LegendLength
1
@LegendLength Ich würde sagen, das stimmt sogar, wenn sie nicht so schlau sind. Sie müssen nicht von Schlauheit ausgehen, weil sie dieselben Fehler machen, an die wir uns erinnern (für mich könnte das sogar bedeuten, dass sie nicht so klug sind ...). Es ist einfacher: Es hilft selten, abweisend zu sein. Es ist in Ordnung, ab und zu falsch zu liegen!
sehe
24

Nein, das solltest du nicht.

Datenbanken wurden speziell entwickelt, um Datensätze zu manipulieren (offensichtlich ....). Daher sind sie dabei unglaublich effizient. Indem er im Wesentlichen eine manuelle Verknüpfung in seinem eigenen Code vornimmt, versucht er, die Rolle von etwas zu übernehmen, das speziell für den Job entwickelt wurde. Die Chancen, dass sein Code jemals so effizient ist wie der in der Datenbank, sind sehr gering.

Abgesehen davon, ohne Verknüpfungen, was bringt es, eine Datenbank zu verwenden? Er kann auch nur Textdateien verwenden.

Richzilla
quelle
2
Auch ohne Joins? Automatische In-Memory-Zuordnung, automatisches Abfrage-Caching, viele andere automatische Dinge, die bei den meisten Dateisystemen überhaupt nicht vorkommen. Oh, habe ich fein kontrollierbare Transaktionen erwähnt?
Piskvor verließ das Gebäude am
19

Wenn "faul" als Personen definiert ist, die weniger Code schreiben möchten, stimme ich zu. Wenn "faul" als Leute definiert wird, die wollen, dass Werkzeuge das tun, was sie gut können, stimme ich zu. Wenn er also nur Larry Wall zustimmt (in Bezug auf die Eigenschaften guter Programmierer), stimme ich ihm zu.

MJB
quelle
Ich habe die Präzision von faul hinzugefügt: für faule Leute, denen Performances egal sind und die es vorziehen, weniger Code zu schreiben. Ich denke, dass Joins für faule Leute sind, aber in diesem Fall sind Joins auch besser als mehrere Anfragen.
Bastien Vandamme
3
@Dran Dane: Joins sind für faule Leute, ja. Die Tatsache, dass sie wahrscheinlich gut abschneiden werden, ist orthogonal.
Piskvor verließ das Gebäude am
16

Ummm, Joins ist, wie relationale Datenbanken Tabellen miteinander in Beziehung setzen. Ich bin mir nicht sicher, worauf er hinaus will.

Wie können mehrere Aufrufe der Datenbank effizienter sein als ein Aufruf? Außerdem sind SQL-Engines dafür optimiert.

Vielleicht ist Ihr Mitarbeiter zu faul, um SQL zu lernen.

Giovanni Galbo
quelle
12

Ja du solltest.

Aus Gründen der Leistung sollten Sie C ++ anstelle von C # verwenden. C # ist für faule Leute.

Nein nein Nein. Aus Leistungsgründen sollten Sie C anstelle von C ++ verwenden. C ++ ist für faule Leute.

Nein nein Nein. Aus Leistungsgründen sollten Sie Assembly anstelle von C verwenden. C ist für faule Leute.

Ja, ich scherze. Sie können schnellere Programme ohne Verknüpfungen erstellen und Programme mit weniger Speicher ohne Verknüpfungen erstellen. ABER in vielen Fällen ist Ihre Entwicklungszeit wichtiger als die CPU-Zeit und der Arbeitsspeicher. Gib eine kleine Leistung auf und genieße dein Leben. Verschwenden Sie Ihre Zeit nicht mit wenig Leistung. Und sag ihm: "Warum machst du keine gerade Autobahn von deinem Platz zu deinem Büro?"

RedPain
quelle
1
Ich habe mir bisher alle Ihre Antworten angesehen und sie sind sehr lustig. Bitte komm weiter. Entweder das oder wo kann ich Ihren Blog abonnieren?
Gerry
11

"Das ist technisch wahr" - ähnlich ist eine SQL-Datenbank nutzlos: Was bringt es, eine zu verwenden, wenn Sie das gleiche Ergebnis erzielen können, indem Sie eine Reihe von CSV-Dateien verwenden und diese im Code korrelieren? Heck, jede Abstraktion ist für faule Leute, lassen Sie uns zur Programmierung in Maschinencode direkt auf der Hardware zurückkehren! ;)

Außerdem ist seine Behauptung in allen außer den kompliziertesten Fällen falsch: RDBMSs sind stark optimiert, um JOINs schnell zu machen . Relationale Datenbankverwaltungssysteme, richtig?

Piskvor verließ das Gebäude
quelle
2
+1 Der Ausdruck "... technisch wahr" hätte besser funktioniert, wenn das OP im vorhergehenden Satz unnecessaryeher Worte verwendet hätte useless. Zu sagen, dass Verknüpfungen nutzlos sind, ist offensichtlich falsch, ohne dass technische Aspekte berücksichtigt werden müssen. In jedem Fall ist das Missverständnis des OP und des Kollegen über den Punkt der RDBMS keine Seltenheit: stackoverflow.com/q/5575682/47550
Paul Sasik
7

Die letzte Firma, für die ich gearbeitet habe, hat auch keine SQL-Joins verwendet. Stattdessen haben sie diese Arbeit auf die Anwendungsebene verschoben, die horizontal skaliert werden soll. Der Grund für dieses Design besteht darin, die Arbeit auf Datenbankebene zu vermeiden. Es ist normalerweise die Datenbank, die zum Engpass wird. Es ist einfacher, die Anwendungsschicht als die Datenbank zu replizieren. Es könnte andere Gründe geben. Aber an diesen kann ich mich jetzt erinnern.

Ja, ich bin damit einverstanden, dass auf Anwendungsebene vorgenommene Verknüpfungen im Vergleich zu von der Datenbank vorgenommenen Verknüpfungen ineffizient sind. Mehr Netzwerkkommunikation auch.

Bitte beachten Sie, dass ich mich nicht darum bemühe, SQL-Joins zu vermeiden.

Srikanth
quelle
Nun, das klingt nach einem rationalen Argument gegen JOINs in Ihrem speziellen Fall. Ich erinnere mich, dass FB Engineering etwas Ähnliches in ihrem Blog gepostet hat - das Skalieren war auch ihre Hauptpriorität. Leider wird nur ein kleiner Prozentsatz der Programmierer dies jemals tun müssen, aber viele denken , dass sie dies tun, "weil OMG Facebook das auch tut";)
Piskvor verließ das Gebäude am
Okay, in einer Unternehmenslösung, in der Sie über genügend Datenverkehr verfügen, um den Datenbankserver zu überlasten, ist dies möglicherweise eine Überlegung wert, aber es ist wahrscheinlicher, dass die Berichterstellung über gespeicherte Prozeduren oder die geplante Sicherung die Leistung beeinträchtigt. Datenbanken sind gut bei Joins, besonders wenn es Unabhängigkeiten gibt, die helfen können
Jodrell
@ Jodrell: Ja, sie sind gut in Joins; Auch hier gibt es Eckfälle, in denen Sie die Eleganz der Verbindungen verringern müssen, um mehr Leistung zu erzielen. Ich habe eine solche Situation getroffen; Wir haben jede mögliche Lösung ausprobiert, und tatsächlich war eine No-Join-Lösung in dieser einen sehr spezifischen Situation am schnellsten . Und nein, auf diesem bestimmten Server lief überhaupt nichts anderes. gespeicherte Prozeduren können Sie nicht verlangsamen, wenn Sie keine haben;)
Piskvor verließ das Gebäude am
5

Wie werden Sie ohne Joins Bestellpositionen mit Bestellungen verknüpfen? Das ist der springende Punkt eines relationalen Datenbankverwaltungssystems. Ohne Verknüpfungen gibt es keine relationalen Daten, und Sie können auch Textdateien zum Verarbeiten von Daten verwenden.

Klingt so, als würde er das Konzept nicht verstehen, also versucht er, es als nutzlos erscheinen zu lassen. Er ist derselbe Typ, der Excel für eine Datenbankanwendung hält. Schlagen Sie ihn albern und sagen Sie ihm, er solle mehr über Datenbanken lesen. Das Herstellen mehrerer Verbindungen und das Abrufen von Daten sowie das Zusammenführen der Daten über C # ist der falsche Weg.

JonH
quelle
5

Ich verstehe die Logik der Aussage "Joins in SQL sind nutzlos" nicht. Ist es sinnvoll, die Daten zu filtern und einzuschränken, bevor Sie daran arbeiten? Wie Sie bereits von anderen Befragten angegeben haben, sollten Datenbank-Engines genau das tun, was sie können.

Vielleicht würde sich ein fauler Programmierer an Technologien halten, mit denen er vertraut war, und andere Möglichkeiten aus nichttechnischen Gründen meiden.

Ich überlasse es Ihnen zu entscheiden.

Jodrell
quelle
5

Betrachten wir ein Beispiel: eine Tabelle mit Rechnungsdatensätzen und eine zugehörige Tabelle mit Rechnungsposteneinträgen. Betrachten Sie den Client-Pseudocode:

for each (invoice in invoices)
    let invoiceLines = FindLinesFor(invoice)
...

Wenn Sie 100.000 Rechnungen mit jeweils 10 Zeilen haben, sucht dieser Code 10 Rechnungszeilen aus einer Tabelle mit 1 Million und dies 100.000 Mal. Mit zunehmender Tabellengröße steigt die Anzahl der Auswahlvorgänge und die Kosten für jeden Auswahlvorgang steigen.

Da Computer schnell sind, stellen Sie möglicherweise keinen Leistungsunterschied zwischen den beiden Ansätzen fest, wenn Sie mehrere tausend Datensätze oder weniger haben. Da der Kostenanstieg mehr als linear ist, werden Sie mit zunehmender Anzahl von Datensätzen (beispielsweise in Millionenhöhe) einen Unterschied bemerken, und der Unterschied wird mit zunehmender Größe des Datensatzes weniger tolerierbar.

Der Join jedoch. verwendet die Indizes der Tabelle und führt die beiden Datensätze zusammen. Dies bedeutet, dass Sie die zweite Tabelle effektiv einmal scannen, anstatt N-mal zufällig darauf zuzugreifen. Wenn ein Fremdschlüssel definiert ist, sind in der Datenbank bereits die Verknüpfungen zwischen den zugehörigen Datensätzen intern gespeichert.

Stellen Sie sich vor, Sie machen das selbst. Sie haben eine alphabetische Liste der Schüler und ein Notizbuch mit allen Notenberichten der Schüler (eine Seite pro Klasse). Das Notizbuch ist nach den Namen der Schüler in derselben Reihenfolge wie die Liste sortiert. Wie würden Sie es vorziehen, fortzufahren?

  1. Lesen Sie einen Namen aus der Liste.
  2. Öffnen Sie das Notizbuch.
  3. Finden Sie den Namen des Schülers.
  4. Lesen Sie die Noten des Schülers und blättern Sie, bis Sie den nächsten oder die letzte Seite des Schülers erreichen.
  5. Schließen Sie das Notizbuch.
  6. Wiederholen.

Oder:

  1. Öffnen Sie das Notizbuch zur ersten Seite.
  2. Lesen Sie einen Namen aus der Liste.
  3. Lesen Sie alle Noten für diesen Namen aus dem Notizbuch.
  4. Wiederholen Sie die Schritte 2-3 bis zum Ende
  5. Schließen Sie das Notizbuch.
Phoog
quelle
5

Klingt nach einem klassischen Fall von " Ich kann es besser schreiben ". Mit anderen Worten, er sieht etwas, das er als eine Art Nackenschmerzen ansieht (er schreibt eine Reihe von Joins in SQL) und sagt: "Ich bin sicher, ich kann das besser schreiben und eine bessere Leistung erzielen." Sie sollten ihn fragen, ob er a) schlauer und b) besser ausgebildet ist als die typische Person, die im Optimierungscode von Oracle oder SQL Server knietief ist. Wahrscheinlich ist er es nicht.

jcollum
quelle
3

Er ist mit Sicherheit falsch. Während Datenmanipulationen in Sprachen wie C # oder Java definitiv Vorteile haben, sind Joins in der Datenbank aufgrund der Natur von SQL selbst am schnellsten.

SQL führt weiterhin detaillierte Statistiken zu den Daten durch. Wenn Sie Ihre Indizes korrekt erstellt haben, können Sie sehr schnell einen Datensatz in ein paar Millionen finden. Abgesehen von der Tatsache, warum sollten Sie alle Ihre Daten in C # ziehen, um einen Join durchzuführen, wenn Sie dies direkt auf Datenbankebene tun können?

Die Profis für die Verwendung von C # kommen ins Spiel, wenn Sie iterativ etwas tun müssen. Wenn Sie für jede Zeile eine Funktion ausführen müssen, ist dies in C # wahrscheinlich schneller. Andernfalls wird das Zusammenführen von Daten in der Datenbank optimiert.

Mike M.
quelle
3

Ich werde sagen, dass ich auf einen Fall gestoßen bin, in dem es schneller war, die Abfrage aufzuschlüsseln und die Verknüpfungen im Code durchzuführen. Davon abgesehen musste ich das nur mit einer bestimmten Version von MySQL tun. Alles andere wird die Datenbank wahrscheinlich schneller sein (beachten Sie, dass Sie möglicherweise die Abfragen optimieren müssen, aber es wird immer noch schneller sein).

JaCraig
quelle
3

Ich vermute, er hat eine eingeschränkte Sicht darauf, wofür Datenbanken verwendet werden sollten. Ein Ansatz zur Maximierung der Leistung besteht darin, die gesamte Datenbank in den Speicher einzulesen. In dieser Situation erzielen Sie möglicherweise eine bessere Leistung, und Sie möchten möglicherweise Verknüpfungen durchführen, wenn der Speicher aus Effizienzgründen vorhanden ist. Dies verwendet jedoch nicht wirklich eine Datenbank, als Datenbank IMHO.

Peter Lawrey
quelle
3
Die meisten Datenbank-Engines erledigen dies ohnehin hinter den Kulissen für Sie. und zB in MySQL können Sie eine rein speicherinterne Tabelle ( MEMORYEngine) erstellen . Die erneute Implementierung der Datenbankfunktionalität ohne die Datenbank ist normalerweise ein Zeichen für einen schweren Fall von NIH;)
Piskvor verließ das Gebäude am
@phoog: Hier nicht erfunden - mit anderen Worten: " Daran habe ich nicht gedacht, also existiert es nicht." Viele Vierkanträder wurden deshalb neu erfunden. (und ja, manchmal ist es nützlich, das Rad neu zu erfinden, z. B. wenn Sie Rennwagen bauen; eine Neuerfindung "nur weil" Ihnen wahrscheinlich kein besseres Rad
bringt
Mit anderen Worten: "Ich habe es nicht geschafft, also muss es Müll sein". Dies hat nur insofern ein Körnchen Wahrheit, als "Ich habe es nicht getestet, damit es möglicherweise nicht für meine Zwecke geeignet ist". Testen Sie es also, bevor Sie es beurteilen.
Peter Lawrey
@Piskvor: Die Datenbank kann nicht unbedingt nur den Speicher des Systems verwenden, auf dem sie ausgeführt wird, während die Anwendung den Speicher des Anwendungsservers verwenden kann. Anders ausgedrückt: Wenn sich die Datenbank auf einem dedizierten Host befindet, erfordert der Zugriff auf diesen Cache weiterhin eine Netzwerkbandbreite und unterliegt einer Netzwerklatenz. Jeder Cache, den die Anwendung verwaltet, kann jedoch mit der Geschwindigkeit einer geringen Latenz des Speicherzugriffs abgefragt werden.
Meriton
2

Nein, Joins sind nicht nur im Datenbankcode besser optimiert als Ad-hoc-C # / Java. In der Regel können jedoch mehrere Filtertechniken angewendet werden, wodurch eine noch bessere Leistung erzielt wird.

Jonas Byström
quelle
2

Er liegt falsch, Joins sind das, was kompetente Programmierer verwenden. Es kann einige begrenzte Fälle geben, in denen seine vorgeschlagene Methode effizienter ist (und in denen ich wahrscheinlich eine Documant-Datenbank verwenden würde), aber ich kann sie nicht sehen, wenn Sie eine betrügerische Datenmenge haben. Nehmen Sie zum Beispiel diese Abfrage:

select t1.field1 
from table1 t1
join table2 t2 
    on t1.id = t2.id
where t1.field2 = 'test'

Angenommen, Sie haben 10 Millionen Datensätze in Tabelle 1 und 1 Million Datensätze in Tabelle 2. Angenommen, 9 Millionen der Datensätze in Tabelle 1 erfüllen die where-Klausel. Angenommen, nur 15 von ihnen befinden sich ebenfalls in Tabelle 2. Sie können diese SQL-Anweisung ausführen, die bei ordnungsgemäßer Indizierung Millisekunden dauert und 15 Datensätze mit nur 1 Datenspalte über das Netzwerk zurückgibt. Oder Sie können zehn Millionen Datensätze mit zwei Datenspalten senden und weitere 1 Million Datensätze mit einer Datenspalte separat über das Netzwerk senden und auf dem Webserver kombinieren.

Oder Sie können natürlich jederzeit den gesamten Inhalt der Datenbank auf dem Webserver speichern, was einfach albern ist, wenn Sie mehr als eine unbedeutende Datenmenge haben und sich ständig ändern. Wenn Sie die Eigenschaften einer relationalen Datenbank nicht benötigen, verwenden Sie keine. Aber wenn Sie dies tun, verwenden Sie es richtig.

HLGEM
quelle
2

Ich habe dieses Argument während meiner Karriere als Softwareentwickler ziemlich oft gehört. Fast jedes Mal, wenn festgestellt wurde, hatte der Antragsteller nicht viel Wissen über relationale Datenbanksysteme, deren Funktionsweise und die Art und Weise, wie solche Systeme verwendet werden sollten.

Ja, bei falscher Verwendung scheinen Verknüpfungen nutzlos oder sogar gefährlich zu sein. Bei richtiger Verwendung besteht jedoch ein großes Potenzial für die Datenbankimplementierung, um Optimierungen durchzuführen und dem Entwickler zu helfen, das richtige Ergebnis am effizientesten abzurufen.

Vergessen Sie nicht, dass JOINSie der Datenbank mithilfe von a mitteilen, wie sich die Daten voraussichtlich zueinander verhalten, und der Datenbank daher mehr Informationen darüber geben, was Sie tun möchten, damit sie Ihren Anforderungen besser entspricht.

Die Antwort lautet also definitiv: Nein, JOINSsind überhaupt nicht nutzlos!

perdian
quelle
0

Dies ist "technisch wahr" nur in einem Fall, der in Anwendungen nicht häufig verwendet wird (wenn alle Zeilen aller Tabellen in den Joins von der Abfrage zurückgegeben werden). In den meisten Abfragen wird nur ein Bruchteil der Zeilen jeder Tabelle zurückgegeben. Das Datenbankmodul verwendet häufig Indizes, um unerwünschte Zeilen zu entfernen, manchmal sogar ohne die tatsächliche Zeile zu lesen, da es die in Indizes gespeicherten Werte verwenden kann. Das Datenbankmodul selbst ist in C, C ++ usw. geschrieben und mindestens so effizient wie der von einem Entwickler geschriebene Code.

fredt
quelle
0

Sofern ich nicht ernsthaft missverstanden habe, ist die Logik in der Frage sehr fehlerhaft

Wenn es in B 20 Zeilen für jedes A gibt, impliziert eine 1000-Zeilen in A 20.000 Zeilen in B. Es können nicht nur 100 Zeilen in B vorhanden sein, es sei denn, es gibt viele-viele-Tabellen "AB" mit 20.000 Zeilen, die die Zuordnung enthalten .

Um alle Informationen darüber zu erhalten, welche 20 der 100 B-Zeilen jeder A-Zeile zugeordnet sind, geben Sie auch AB ein. Das wäre also entweder:

  • 3 Ergebnismengen mit 100, 1000 und 20.000 Zeilen und ein Client JOIN
  • eine einzelne verknüpfte A-AB-B-Ergebnismenge mit 20.000 Zeilen

"JOIN" im Client bietet also einen Mehrwert, wenn Sie die Daten untersuchen. Nicht dass es keine schlechte Idee wäre. Wenn ich ein Objekt aus der Datenbank abgerufen habe, ist es möglicherweise sinnvoller, es in separate Ergebnismengen aufzuteilen. Bei einem Berichtstyp würde ich ihn fast immer zu einem reduzieren.

Auf jeden Fall würde ich sagen, dass eine Kreuzverbindung dieser Größenordnung fast keinen Sinn hat. Es ist ein schlechtes Beispiel.

Sie müssen sich irgendwo anmelden, und darin sind RDBMS gut. Ich möchte nicht mit einem Client-Code-Affen arbeiten, der glaubt, dass er es besser machen kann.

Nachgedacht:

Für die Teilnahme am Client sind persistente Objekte wie DataTables (in .net) erforderlich. Wenn Sie eine abgeflachte Ergebnismenge haben, kann diese über etwas Leichteres wie einen DataReader verwendet werden. Hohes Volumen = viele Clientressourcen, die verwendet werden, um eine Datenbankverbindung zu vermeiden.

gbn
quelle