Ist die Reihenfolge der Ausdrücke oder Prädikate macht einen Unterschied in der Join-Bedingung für Außen in Standard-SQL verbindet?

stimmen
2

So habe ich ein bisschen einen frustrierenden Tag. Ich wurde aus einem Vertrag entlassen Ich hatte die letzten Wochen gearbeitet, weil ich nicht „mit dem Team ineinander greifen.“ Zwei Beispiele wurden genannt:

1) Gestern wurde ich gebeten , alle Daten aus einer SQL Server - Datenbank zu löschen , außer für einige Baseline Systemdaten. Der Anfragende (nicht mein Chef) hatte etwa acht Skripte sie vor ein paar Monaten für diese Aufgabe eingesetzt hatte. Offenbar hat niemand jemals gedacht , das Datenmodell an das Skript oder die Systemdaten.

Diese Person hatte ein Muster von über komplizieren Dingen etabliert, so dass ich versuche, die Gründe für die Aufgabe und das Endziel zu verstehen. Ich kämpfte auch zu verstehen, warum sie alle möglichen vage Fehler immer bekam, dass alle diese zusätzlichen Skripte benötigt, um „zu entfernen und erneut hinzufügen Einschränkungen“.

Ich war durchaus bereit, alles Notwendige zu tun, und wir sprachen einige Minuten darüber. Ich Aus offensichtlichen Gründen gedacht, dass die Suche nach zu verstehen, warum eine gute Sache war. Plötzlich entschied sie sich, dass es nur schneller, es selbst zu tun, anstatt die Zeit damit verbringen, sie alle zu mir erklären, und ich ging zu meiner anderen Arbeit zurück, ohne mehr darüber nachzudenken.

Irgendwie war dies negativ interpretiert.

2) Vor einigen Wochen während meiner ersten Woche wurde ich gebeten , auf Zusammenführung einige Daten aus einem anderen System zu arbeiten. Ich war ein 600+ Zeilenskript von SQL - Schnipsel gegeben , die alle erschienen über schlechte Daten zusammen mit einer mündlichen Tirade von Beschwerden wichtig zu sein und die ursprünglichen Programmierer. Natürlich dauerte es ein wenig Zeit durch eng waten , aber nach ein paar Tagen mein Endergebnis entstand als einfaches MERGE in etwa 25 Zeilen.

Ich habe seit mehr als zehn Jahren SQL geschrieben, und ich halte ich in der Gegend einige Erfahrung zu haben. Meine Mitarbeiter waren immer ein wenig ungeduldig, als ich die Schichten von unnötiger Komplexität abgeschält und ich blieb spät, um die Aufgabe zu beenden, wie versprochen.

Ich war nicht sicher, wie leicht würden sie akzeptieren, dass die Lösung des Problems genau ein sehr kurzer Befehl zu sein schien, und ich fragte mich, ob ich etwas fehlte, die peinlich erweisen würden. Leider waren alle meine bohrenden Fragen immer wieder mit der Art von abweisend Nicht-Antworten erfüllt, die schlechte Lehrer zu einer übermäßig neugierig Grundschüler geben. Also schickte ich die Abfrage zusammen in einer E-Mail und ging nach Hause.

Am nächsten Morgen wurde ich (gleiche Person wie # 1) gesagt, dass es falsch war, aber es war Sachen, die ich nicht als der neue Mann erwartet werden konnte wissen. Sie erklärte, dass sie sich zurückhalten musste von Umschreiben alles. Einer ihrer Punkte war etwas kleinere über die Daten, die ich schon mit ihr über mich gedacht hatte, zu fragen. Der andere war rein SQL.

(Die Frage beginnt hier.)

Nehmen Sie eine typische linke äußere Szenario verbinden. Wir alle wissen , dass die Reihenfolge der Tabellen sehr bedeutsam ist, zB Q1 und Q2 nicht gleichwertig sind :

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON A.id = B.id -- (Q1)
SELECT A.x, B.y FROM B LEFT OUTER JOIN A ON B.id = A.id -- (Q2)

Wenn ich vom Konzept her über mehr denken tritt es in der Regel mich natürlich erscheint die neue Tabelle als das Objekt von Interesse, mich vorzustellen, Aufnehmen und dann beschreiben, wie seine Reihen zu beziehen, was vorher gekommen ist. nicht die Bedingungen parallel zu halten keinen Vorteil zu mir und von meiner eigenen Gewohnheit, die ich im Allgemeinen der Join-Bedingung auf diese Weise schreiben:

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON B.id = A.id -- (Q3)

So finde ich mich über betreutes werden , wie die Reihenfolge der Tabellen Angelegenheiten in einem äußeren Verknüpfung. Ich hatte gedacht , diesen Test meiner Intelligenz bereits im Vorstellungsgespräch durchgeführt. Meine Verwirrung verwandelte sich in Stupor , als ich merkte , dass sie nur auf den Gleichheitsvergleich wurde konzentriert. Zu ihrem Q3 war falsch und Q1 war die Version , die ich stattdessen benötigt.

Ich bestehen darauf, diplomatisch, dass es keinen Unterschied überhaupt gemacht hat und dass ich einfach meinen Fall sein, wenn sie wollte. Ich versuchte, sie Argumentation zu klären, aber das ist die Art von Person, die nicht eng auf Ihre Fragen, egal hört, wie sorgfältig sie formuliert sind oder wie viele technische Worte, die Sie ein kleines Maß an Kompetenz vorschlagen bedienen, so habe ich beschlossen, dass ich gerade konnte überzeugen sie nicht, dass ich kein Idiot bin. Und ich stimmte das Skript zu ändern, weil es nicht wert war, darüber zu streiten.

Ich nehme an, dass nicht sofort meinen Stolz schlucken gezeigt, dass ich nicht war „coachbar.“


Was Stil allein, I entsprechen einem Standard der Arbeitgeber bevorzugt, obwohl ihre SQL auf andere Weise oft schlampig ist. Ich erkennen, dass mit dem alten Stil äußeren Join-Syntax dieser Angelegenheit würde. Darüber hinaus habe ich noch nie diesen Fall machen gehört niemandem. Bitte beantworten Sie diese Frage und meinen Ruf einlösen.

Ist die Reihenfolge der Ausdrücke oder Prädikate macht einen Unterschied in der Join-Bedingung für Außen in Standard-SQL verbindet?

Veröffentlicht am 07/07/2012 um 01:54
vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
2

Die Reihenfolge der Gleichheit Vergleich macht keinen Unterschied zu den Ergebnissen des Joins. Aber es könnte für unergründliche Gründe Einfluss auf die Effizienz, mit der das Ergebnis berechnet wird. SQL-Optimierer sind berüchtigt für durch scheinbar unwichtige Details wie diese beeinflusst werden.

Beantwortet am 07/07/2012 um 02:04
quelle vom benutzer

stimmen
4

Nein, es macht keinen Unterschied.

Persönlich ziehe ich den Stil, den Sie in Q3 zeigen, bevorzugen einige meiner Kollegen den Stil in Q1. Ich weiß nicht , wer entweder von ihnen jemals in Betracht ziehen würde sein falsch .

Die Abfrage optimiser schaltet die Abfrage von innen nach außen in etwas ganz anderes, so das Prädikat existiert nicht sogar als einfachen Vergleich mehr jeder, wenn er mit ihm fertig ist. Normalerweise ist es eine Suche in einem Index oder eine Tabelle, und so, dass nur in eine Richtung erfolgen, wie das Prädikat geschrieben macht keinen Unterschied.

Ich habe (in SQL Server 2005) den Ausführungsplan von zwei Abfragen mit dem Prädikat Operanden in unterschiedlicher Reihenfolge und wie sie identisch sind zu erwarten.

Beantwortet am 07/07/2012 um 02:21
quelle vom benutzer

stimmen
2

Ich ziehe es Q3 zu Zustand um JOIN:

... ON B.id = A.id -- (Q3)

Wie es spiegelt direkt, dass der B.id desto unterschiedlicher ist, können Sie von A.id als Konstante Wesen gegen getestet denken, zB

B.id = 1984

In der gleichen Richtung, dass ich will das nicht in dem Code sehen ...

1984 = B.id

..., wie du Ich will das nicht in Abfrage sehen:

A.id = B.id

Doch wie die meisten Dinge im Leben, gibt es Leute, die Little-Endian mögen, und es gibt diejenigen, die Big-Endian mögen. Was auch immer mentale Modell es sie auf der Präferenz dienen können sie gewählt haben, sollten sie zumindest in der Lage sein, Ihnen zu erklären, die Gründe, warum sie wolltenA.id = B.id

Ich denke, ich habe allerdings meine Vorliebe wechseln, meine (und Ihre) bevorzugte Bedingung arbeiten, um nicht in einigen ORM, Linq im Besonderen. Ich habe noch zu begreifen, warum sie verhängen, dass die Bedingung in Q1 sein sollte:

from x in A
join y in B on x.id equals y.id

Und die Umkehrung die Bedingung (gleich wie Q3, obwohl in SQL-Abfrage ist es nicht ein Fehler), um Ergebnisse zu Syntaxfehlern, wird dies nicht von Linq akzeptiert werden:

from x in A
join y in B on y.id equals x.id

Nun muss ich die Gründe finden, warum Microsoft Linq Designer die Bestellung des Q1 Zustand bevorzugt. Und versuchen Sie es zu schätzen, wenn es sinnvoll ist, und akzeptiert nur noch funktioniert es (noch) nicht sinnvoll.


Bezüglich:

Ist die Reihenfolge der Ausdrücke oder Prädikate macht einen Unterschied in der Join-Bedingung für Außen in Standard-SQL verbindet?

Ergebnisse weisen, NO . Performance-weise, ich habe noch eine Abfrage , um zu sehen , wo die Bedingung , um die Abfrage schneller macht das beitreten. Selbst in den Foren habe ich nicht gesehen jemand Umkehrung der Bedingung unterstützt schneller die Abfrage zu machen.

Wenn sie nicht zu dir die Gründe oder die mentale Modell ihrer bevorzugten Zustand der Ordnung dient erklären kann, vielleicht tun sie nur Cargo Cult Programmierung oder schlimmer noch, Bikeshedding

Beantwortet am 07/07/2012 um 02:48
quelle vom benutzer

stimmen
1

Ich ziehe es Ihre Q1, aber es macht absolut keinen Unterschied in der Leistung und hat absolut keinen Einfluss auf den Abfrageoptimierer.

Für mich gibt den vorherigen Tisch setzt zuerst mir die relevanten Informationen früher in meinem Scan - Prozess. Ich kann lesen join table B on A ...und schon wissen , welche zwei Tabellen miteinander verbunden werden. Wenn ich lese , join table B on B.blasdjasdid = ...ich habe viel weiter scannen und wissen noch nicht , die wichtigsten Informationen, die Tabelle verbunden wird (das ist eine Art von Namespace ist eine Domäne , unter denen der Spaltenname verstanden werden). Außerdem, wenn die Spalten , die in beiden Tabellen (idiomatischen in jedem Datenbank I Design) genannt werden, kann ich Scannen bis zum Ende völlig vermeiden, nur das Lesen join table B on A.SomethingId ...und bereits weiß , dass es ist = B.SomethingId.

Gehen , ein wenig tiefer, würde ich Sie ermutigen , über dieses Ereignis zu fragen , workplace.stackexchange.com , weil ich vermute , dass die Gründe waren Ihre Dienste eingestellt nicht übereinstimmen , was sie dir gesagt; einige Untersuchung könnte dies produktiv sein. Ich schlage nicht vor ihm deine Schuld ist, sondern dass der Grund gegeben war wahrscheinlich ein Vorwand.

Beantwortet am 29/12/2015 um 19:14
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more