Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

INNER JOIN kurz oder lang schreiben - Unterschied?

Dieses Thema im Forum "Oracle" wurde erstellt von ITrun90, 24 Januar 2014.

  1. ITrun90

    ITrun90 Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
    ITrun90 gefällt das.
  3. ukulele

    ukulele Datenbank-Guru

    Bei MSSQL (im Schnelltest) habe ich übrigens auch exakt identische Abfragekosten.
     
    akretschmer gefällt das.
  4. ITrun90

    ITrun90 Benutzer

    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).
     
  5. LeaCrow

    LeaCrow Benutzer

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden