| 

.NET C# Java Javascript Exception

4
Ich hätte da eine grundsätzliche Frage, zu der ich irgendwie keine Antwort finden kann.

Ich mache Datenbankabfragen über mehrere Tabellen immer in dieser Art:

SELECT * FROM
user AS USER,
rights AS RIGHTS,
rightsuser as COMB
WHERE
USER.id = COMB.user AND
COMB.right = RIGHTS.id

Alternativ könnte man so eine Abfrage ja auch mit Joins durchführen.

Was ist denn besser? Mal abgesehen von der Performance, warum sollte ich die eine oder andere Variante bevorzugen?
20.07.2011
smac 55 4
4 Antworten
2
Also das geht eigentlich alles schon in die richtige Richtung, jedoch liegt der Unterschied nicht allein in der Schreibweise. Wenn man in einem Statement explizit JOIN verwendet, dann wird auch genau das getan - wird jedoch die oben genannte Form verwendet, dann greift die Query-Optimierung des Datenbankmanagementsystems. Diese Optimierung führt beim genannten Statement definitiv zu einem JOIN (was ja schon angedeutet wurde), welcher, ist jedoch nicht immer klar. Demnach ist das Verzichten auf JOIN (fast) immer die bessere Variante.

Es gibt allerdings Ausnahmen... und zwar hängen diese mit dem DBMS zusammen. OpenSource Datenbanksysteme, wie MySQL, Postgres oder Firebird sind im Bereich der Query-Optimierung teilweise recht schwach auf der Brust. Bei besonders komplizierten bzw. umfangreichen Abfragen macht deshalb der Vergleich unterschiedliche Statement-Varianten durchaus Sinn, da sich signifikante Laufzeit-Unterschiede ergeben können.

Sollte dann die Laufzeit immernoch zu schlecht, kann man einerseits mit Indizes arbeiten, andererseits könnte man (materialisierte) Views in unterschiedlichen Varianten (Snapshot, Eager, Lazy, Very Lazy) verwenden. Eine Einführung wird hier gegeben.
20.07.2011
DevConfusion 149 1 3
3
Dein SQL-Statement ist ein Join. Du verwendest nur nicht das Join-Schlüsselwort, sondern drückst quasi auf Spaltenebene aus, was Du willst. Mir gefällt diese Schreibweise übrigens auch besser, ich finde sie irgendwie natürlicher.

Was Du damit bekommst, ist aber immer ein "inner join". (siehe Join (SQL) bei Wikipedia). Es gibt auch outer joins. Diese liefern Dir auch alle Zeilen aus USER bzw. RIGHTS, zu denen es kein Gegenstück in der jeweils anderen Tabelle gibt (die entsprechenden Ergebnisspalten sind dann leer). Für diese Joins brauchst Du meines Wissens das Join-Schlüsselwort.

Ob es zwischen deiner Syntax und der Verwendung von "inner join" irgendeinen Performance-Unterschied gibt, weiß ich nicht sicher, aber ich gehe davon aus, dass es äquivalent ist.
20.07.2011
Matthias Hlawatsch 13,2k 4 9
3
Konnte ebenfalls keinen nennenswerten Performance-Unterschied feststellen. Siehe: http://codekicker.de/fragen/mysql-MySQL-performanter-optimierung/1912#a6282
Dustin Klein 20.07.2011
2
Ich finde "join" natürlicher und übersichtlicher. Gerade wenn du SQL-Statements mit 10 oder 15 Tabellen hast steht hinter dem Join immer die Bedingungen, die du ansonsten in die Where-Klausel schreiben würdest. Meiner Meinung nach ist das übersichtlicher und lesbarer.
Floyd 20.07.2011
@Floyd ja, da ist schon auch was dran. Mich nervt an der join-Syntax vor allem, dass sie mir optisch die From-Klausel zerhaut. Meist will ich erst mal wissen (bzw. hinschreiben) aus welchen Tabellen gelesen wird, und erst danach interessiere ich mich für die Art und Weise, wie die Verknüpfungen zustande kommen.
Matthias Hlawatsch 20.07.2011
Ich bin zwar kein SQL-Profi, aber ich meine mich zu erinnern, dass die obige Syntax u. U. zu einem Kreuzprodukt (oder auch kartesisches Produkt) führt. Das ist wesentlich umfangreicher als ein Join. Bei großen Datenmengen dürfte sich das dann schon deutlich bemerkbar machen.
(vgl. [url=http://rowa.giso.de/oracle/latex/Komplexere_SQL_Abfragen.html#SECTION00231700000000000000]Kreuzprodukt[/url])
jsc 20.07.2011
1
@Matthias, findest du? Also ich schreibe joins so:
select *
from Tabelle1 T1
join Tabelle2 T2 on T1.ID = T2.COL2
join Tabelle3 T3 on T1.ID = T3.COL2
left join Tabelle4 T4 on T3.COL5 = T4.COl3

und find es sehr gut lesbar. Gerade weil man es prima als Text lesen kann:
"lese alle spalten" select *
"aus Tabelle1 alias T1" from Tabelle1 T1
"verknüpfe Tablle2 alias T2" join Tabelle2 T2
"anhand von ID und COL2" on T1.ID = T2.COL2
Floyd 20.07.2011
1
Ich verwende das äquivalent. Das Schlüsselwort JOIN verwende ich nicht mehr, da es eine spezielle Syntax benötigt und ich keine Lust habe diese Konstrukt in meinen SQL-Statements zu haben, wenn ich es über die "normale" WHERE-Klausel behandeln kann.

Ob es Geschwindigkeitsunterschiede gibt, weiss ich nicht genau. Das wird wenn überhaupt, sehr datenbankspezifisch sein. Für ORACLE kann ich keine nennenswerten Unterschiede feststellen. Wichtig ist bei Tabellen-Joins sowieso immer der Index auf den entsprechenden Spalten.

Unter bestimmten Umständen kann das Schlüsselwort JOIN notwendig sein, weil darüber bei einigen Datenbanken Left Join, right join oder outer join realisiert werden. Kommt dann halt auf die Situation an, die man vorfindet.

In deinem Fall würde ich die normale Where-Klausel verwenden. Es handelt sich dabei um einen normalen inner join.
20.07.2011
oopexpert 455 1 8
0
Vielen Dank für eure Antworten. Dass diese Syntax Joins bedeuten war nicht klar. Wie ich aus euren Antworten lesen kann geht es dabei hauptsächlich um persönliche Vorlieben bzw. Übersichtlichkeit und nicht um falsch oder nicht falsch.
21.07.2011
smac 55 4
Naja, du nutzt halt eine erweiterte Syntax, die du in den meisten Fällen gar nicht benötigst. Ist natürlich ein maginaler Einwand. Aber das Problem ist nie "die kleine Einzelentscheidung" sondern die Summe aller Entscheidungen, die am Ende eine Software schwierug zu warten macht.
oopexpert 08.08.2011

Stelle deine Mysql-Frage jetzt!