INNER JOIN kurz oder lang schreiben - Unterschied?

ITrun90

Benutzer
Beiträge
6
Hi Leute,

ich studiere Informatik und hab am Montag eine Datenbank-Klausur. Eine Sache ist mir noch nicht ganz klar:

Ich habe eine Tabelle Buch (mit Büchern) und eine Tablle Autor (mit Autoren). Jedes Buch darf, veranab jeder Realität, nur einen Autor haben.

Möchte ich nun alle Bücher und die passenden Autoren ausgeben, kann ich dies ja auf 2 Arten lösen:

1.

SELECT * FROM Buch, Autor WHERE Buch.BuchOID = Autor.BuchOID;

2.

SELECT * FROM Buch INNER JOIN Autor using (BuchOID);

Ein Professor bei uns sagte mal, dass die erste Variante nicht so performant sei, wie die Zweite.

In einem Buch allerdings habe ich gelesen, dass es ganz egal sei, welches der beiden Lösungen man nehme.

Wie steht der SQL - Standard dazu? und was sagt Oracle?
 
Werbung:
Ein Professor bei uns sagte mal, dass die erste Variante nicht so performant sei, wie die Zweite.

In einem Buch allerdings habe ich gelesen, dass es ganz egal sei, welches der beiden Lösungen man nehme.

Wie steht der SQL - Standard dazu? und was sagt Oracle?

Was der Prof sagt, ist das eine. Was sagt Explain dazu?

Code:
test=# create table buch(id int primary key, name text);
CREATE TABLE
Time: 26,013 ms
test=*# create table autor (id int primary key, buch int references buch, name text);
CREATE TABLE
Time: 4,510 ms
test=*# set enable_seqscan to off;
SET
Time: 0,039 ms
test=*# explain select * from buch, autor where autor.buch=buch.id;
  QUERY PLAN
---------------------------------------------------------------------------------------
 Hash Join  (cost=10000000077.98..10000000115.53 rows=1160 width=76)
  Hash Cond: (autor.buch = buch.id)
  ->  Seq Scan on autor  (cost=10000000000.00..10000000021.60 rows=1160 width=40)
  ->  Hash  (cost=62.60..62.60 rows=1230 width=36)
  ->  Index Scan using buch_pkey on buch  (cost=0.15..62.60 rows=1230 width=36)
(5 rows)

Time: 0,638 ms
test=*# explain select * from buch inner join autor on (autor.buch=buch.id);
  QUERY PLAN
---------------------------------------------------------------------------------------
 Hash Join  (cost=10000000077.98..10000000115.53 rows=1160 width=76)
  Hash Cond: (autor.buch = buch.id)
  ->  Seq Scan on autor  (cost=10000000000.00..10000000021.60 rows=1160 width=40)
  ->  Hash  (cost=62.60..62.60 rows=1230 width=36)
  ->  Index Scan using buch_pkey on buch  (cost=0.15..62.60 rows=1230 width=36)
(5 rows)

Unterschied? Keiner. (mal abgesehen von den falschen Schätzungen, es lief noch kein ANALYSE)

Ora arbeite ähnlich zu PostgreSQL (was ich verwende), das hat auch ein Explain. Nutze es und zeige dem Prof, wo er irrt.
Da bekommst bestimmt 'nen Punkt dafür ;-)

Und ja: das erste ist ein implizieter Join, das zweite ein explizieter Join. Die zweiter Form sollte bevorzugt werden, weil Sie syntaktisch durch das on (...) oder using(...) dazu zwingt, die Join-Condition extra anzugeben. In der ersten Form läufst Gefahr, das im Where zu vergessen und bekommst das, was man bei sehr großen Tabellen definitiv nicht will: einen cross join.
 
Super, vielen Dank für die schnelle und anschauliche Beantwortung ;) dann hat das Buch doch recht gehabt, hehe. Ggfs. hat sich der Prof. auch einfach nur vertan, kann ja mal passieren (eigentlich hat er echt was aufm Kasten).
 
Werbung:
INNER JOIN ist die ANSI-SQL Syntax und sollte laut Oracle verwendet werden. Das andere ist Oracle proprietär.

Das sagen die offiziellen Oracle Schulungsunterlagen. An Oracle Prüfungen wird nur ANSI-JOIN getestet.
 
Zurück
Oben