it-swarm.com.de

Inner Join vs Wo

Gibt es einen Unterschied in der Leistung (in Oracle) zwischen

Select * from Table1 T1 
Inner Join Table2 T2 On T1.ID = T2.ID

Und

Select * from Table1 T1, Table2 T2 
Where T1.ID = T2.ID

?

247
juan

Nein! Den gleichen Ausführungsplan finden Sie in diesen beiden Tabellen:

CREATE TABLE table1 (
  id INT,
  name VARCHAR(20)
);

CREATE TABLE table2 (
  id INT,
  name VARCHAR(20)
);

Der Ausführungsplan für die Abfrage unter Verwendung der inneren Verknüpfung:

-- with inner join

EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2

Und der Ausführungsplan für die Abfrage unter Verwendung einer WHERE-Klausel.

-- with where clause

EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
188
kiewic

Wenn das Abfrageoptimierungsprogramm seine Arbeit ordnungsgemäß ausführt, sollte zwischen diesen Abfragen kein Unterschied bestehen. Dies sind nur zwei Möglichkeiten, um dasselbe gewünschte Ergebnis anzugeben.

65
Craig Trader

Sie sollten genau gleich sein. Als Codierungsmethode würde ich jedoch eher den Join sehen. Es artikuliert klar Ihre Absicht,

59
Nescio

Die Verwendung von JOIN erleichtert das Lesen des Codes, da es selbsterklärend ist.

Es gibt keinen Unterschied in der Geschwindigkeit (ich habe es gerade getestet) und der Ausführungsplan ist der gleiche.

26
user21241

Ich weiß nichts über Oracle, aber ich weiß, dass die alte Syntax in SQL Server veraltet ist und irgendwann verschwinden wird. Bevor ich diese alte Syntax in einer neuen Abfrage verwendete, überprüfte ich, was Oracle damit vorhat.

Ich bevorzuge die neuere Syntax, anstatt die Join-Kriterien mit anderen erforderlichen Where-Bedingungen zu mischen. In der neueren Syntax ist viel klarer, was den Join erzeugt und welche anderen Bedingungen angewendet werden. Bei einer kurzen Abfrage wie dieser ist das kein großes Problem, aber bei einer komplexeren Abfrage wird es viel verwirrender. Da die Leute mit den grundlegenden Abfragen vertraut sind, würde ich es vorziehen, wenn die Leute lernen, die Join-Syntax zu verwenden, bevor sie sie in einer komplexen Abfrage benötigen.

Und wieder kenne ich Oracle nicht speziell, aber ich weiß, dass die SQL Server-Version des Links-Joins alten Stils selbst in SQL Server 2000 fehlerhaft ist und inkonsistente Ergebnisse liefert (manchmal ein Links-Join, manchmal ein Cross-Join), so dass dies niemals der Fall sein sollte gebraucht. Hoffentlich leidet Oracle nicht unter dem gleichen Problem, aber Links- und Rechts-Joins können in der alten Syntax schwieriger auszudrücken sein.

Außerdem habe ich die Erfahrung gemacht (und natürlich handelt es sich hierbei ausschließlich um eine persönliche Meinung, Sie haben möglicherweise andere Erfahrungen), dass Entwickler, die die ANSII-Standard-Joins verwenden, ein besseres Verständnis dafür haben, was ein Join ist und was es in Bezug auf das Erhalten bedeutet Daten aus der Datenbank. Ich glaube, das liegt daran, dass die meisten Leute mit gutem Datenbankverständnis dazu neigen, komplexere Abfragen zu schreiben, und diese scheinen mir mit dem ANSII-Standard weitaus einfacher zu warten zu sein als der alte Stil.

15
HLGEM

[Für einen Bonuspunkt ...]

Mit der JOIN-Syntax können Sie den Join einfacher auskommentieren, da alle Elemente in einer Zeile enthalten sind. Dies kann nützlich sein, wenn Sie eine komplexe Abfrage debuggen

Wie alle anderen sagen, sind sie funktionell gleich, jedoch ist das JOIN klarer als eine Absichtserklärung. Es hilft daher kann dem Abfrageoptimierer entweder in aktuellen Oracle-Versionen in bestimmten Fällen (ich habe keine Ahnung, ob dies der Fall ist), kann dem Abfrageoptimierer in zukünftigen Versionen von Oracle (Niemand hat eine Idee), oder es kann helfen, wenn Sie den Datenbankanbieter wechseln.

14
Chris Gill

Sie sind logisch identisch, aber in früheren Versionen von Oracle, die ANSI-Syntax verwendeten, gab es in komplexeren Fällen häufig Fehler, sodass Sie manchmal auf Widerstand von Oracle-Entwicklern stoßen, wenn Sie sie verwenden.

13
David Aldridge

Die Leistung sollte identisch sein, ich würde jedoch vorschlagen, die Join-Version zu verwenden, da die Übersichtlichkeit in Bezug auf äußere Joins verbessert ist.

Auch ungewollte kartesische Produkte können mit der Join-Version vermieden werden.

Ein dritter Effekt ist ein einfacher zu lesender SQL-Code mit einer einfacheren WHERE-Bedingung.

7
stili

Vergessen Sie nicht, dass Sie in Oracle unter der Voraussetzung, dass die Join-Schlüsselattribute in beiden Tabellen den gleichen Namen haben, Folgendes schreiben können:

select *
from Table1 inner join Table2 using (ID);

Dies hat natürlich auch den gleichen Abfrageplan.

6
cheduardo

In PostgreSQL gibt es definitiv keinen Unterschied - beide entsprechen demselben Abfrageplan. Ich bin mir zu 99% sicher, dass dies auch bei Oracle der Fall ist.

3
Nick Johnson

In einem Szenario, in dem Tabellen in der 3. Normalform vorliegen, sollten sich Verknüpfungen zwischen Tabellen nicht ändern. Das heißt trete KUNDEN bei und BEZAHLUNGEN sollten immer gleich bleiben.

Wir müssen jedoch Verknüpfungen von Filter unterscheiden. Bei Joins geht es um Beziehungen, und bei Filtern geht es darum, ein Ganzes zu partitionieren.

Die SQL-92-Syntax ermutigt uns, beide Konzepte zu trennen, und sie ist der alten Syntax vorzuziehen, bei der sowohl Verknüpfungen als auch Filter auf die umständlichere WHERE-Klausel angewendet werden.

3
jackattack

Funktionell sind sie die gleichen wie gesagt. Ich bin damit einverstanden, dass das Ausführen des Joins besser ist, um genau zu beschreiben, was Sie tun möchten. Oft dachte ich, ich wüsste, wie ich etwas abfragen wollte, bis ich anfing, die Verknüpfungen auszuführen, und realisierte, dass ich eine andere Abfrage als die ursprüngliche in meinem Kopf durchführen wollte.

2
MattC

Sie sind beide innere Verknüpfungen, die dasselbe tun, man verwendet einfach die neuere ANSI-Syntax.

1
Bob Gettys

Es ist richtig, dass beide Abfragen funktionell auf die gleiche Weise verarbeitet werden sollten. Die Erfahrung hat jedoch gezeigt, dass es beim Auswählen aus Ansichten, die die neue Join-Syntax verwenden, wichtig ist, auch Ihre Abfragen damit zu strukturieren. Der Optimierer von Oracle kann verwirrt werden, wenn eine Ansicht eine "join" -Anweisung verwendet, eine Abfrage, die auf die Ansicht zugreift, jedoch die herkömmliche Methode zum Verbinden in der "where" -Klausel verwendet.

1
JoshL

Wie Kiewik sagte, ist der Ausführungsplan der gleiche.

Die JOIN-Anweisung ist nur einfacher zu lesen, was es einfacher macht, die ON-Bedingung nicht zu vergessen und ein kartesisches Produkt zu erhalten. Diese Fehler können bei langen Abfragen mit mehreren Joins des Typs sehr schwer zu erkennen sein: SELECT * FROM t1, t2 WHERE t1.id = t2.some_field.

Wenn Sie nur eine Join-Bedingung vergessen, wird die Ausführung einer Abfrage sehr lang und es werden zu viele Datensätze zurückgegeben ... wirklich zu viele. Einige Leute verwenden ein DISTINCT, um die Abfrage zu patchen, aber die Ausführung dauert noch sehr lange.

Genau deshalb ist die Verwendung von JOIN-Anweisungen sicherlich die beste Vorgehensweise: eine bessere Wartbarkeit und eine bessere Lesbarkeit.

Wenn ich mich recht erinnere, ist JOIN außerdem in Bezug auf die Speichernutzung optimiert.

0

Obwohl die Identität zweier Abfragen offensichtlich zu sein scheint, passieren manchmal seltsame Dinge. Ich bin auf die Abfrage gestoßen, die beim Verschieben des Join-Prädikats von JOIN nach WHERE in Oracle 10g unterschiedliche Ausführungspläne hat (für WHERE ist der Plan besser), kann dieses Problem jedoch nicht in vereinfachten Tabellen und Daten reproduzieren. Ich denke, es hängt von meinen Daten und Statistiken ab. Optimizer ist ein recht komplexes Modul und verhält sich manchmal magisch.

Aus diesem Grund können wir diese Frage im Allgemeinen nicht beantworten, da sie von DB-Interna abhängt. Aber wir sollten wissen, dass die Antwort 'keine Unterschiede' sein muss.

0
greatvovan

Sie sind beide mit dabei und wo machen die das selbe.

Schauen Sie sich in MySQL-Abfragen an, warum Join anstelle von Where verwenden?

0
rxpande

ich hatte heute dieses Rätsel, als ich eine Zeitüberschreitung unserer SPs in der Produktion untersuchte und eine innere Verknüpfung für eine Tabelle aus einem XML-Feed in eine 'where'-Klausel änderte. Die durchschnittliche Ausführungszeit beträgt jetzt 80 ms über 1000 Ausführungen, wohingegen bevor die durchschnittliche Ausführungszeit 2,2 Sekunden betrug ... Der Hauptunterschied im Ausführungsplan ist das Fehlen einer Schlüsselsuche ... Die Meldung, die Sie erst kennen, wenn Sie beide Methoden getestet haben.

prost.

0
trbullet81