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?
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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?"
quelle
"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?
quelle
unnecessary
eher Worte verwendet hätteuseless
. 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/47550Die 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.
quelle
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.
quelle
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.
quelle
Betrachten wir ein Beispiel: eine Tabelle mit Rechnungsdatensätzen und eine zugehörige Tabelle mit Rechnungsposteneinträgen. Betrachten Sie den Client-Pseudocode:
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?
Oder:
quelle
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.
quelle
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.
quelle
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).
quelle
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.
quelle
MEMORY
Engine) erstellen . Die erneute Implementierung der Datenbankfunktionalität ohne die Datenbank ist normalerweise ein Zeichen für einen schweren Fall von NIH;)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.
quelle
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:
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.
quelle
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
JOIN
Sie 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,
JOINS
sind überhaupt nicht nutzlos!quelle
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.
quelle
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:
"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.
quelle