| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

welche MySQL Abfrage ist aus Eurer Sicht zu empfehlen:

SELECT * FROM tab1 JOIN tab2 On (tab1.kunde = tab2.kunde , tab1.auftrag = tab2.auftrag) Where tab1.zeit > irgendwas


oder

SELECT * FROM tab1,tab2 where tab1.kunde = tab2.kunde and tab1.auftrag = tab2.auftrag and tab1.zeit > irgendwas


(Die Sterne sind natürlich nur zur Vereinfachung eingesetzt ;-))

Vielen Dank für Eure Meinungen!
News:
11.05.2011
doublem 683 1 1 9
2 Antworten
3
In dem Mysql Handbuch ist eine gute Erläuterung, diese sollte deine Frage eig. beantworten.

http://dev.mysql.com/doc/refman/5.5/en/left-join-optimization.html

For a LEFT JOIN, if the WHERE condition is always false for the generated NULL row, the LEFT JOIN is changed to a normal join. For example, the WHERE clause would be false in the following query if t2.column1 were NULL:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

Therefore, it is safe to convert the query to a normal join:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

This can be made faster because MySQL can use table t2 before table t1 if doing so would result in a better query plan. To provide a hint about the table join order, use STRAIGHT_JOIN. (See Section 12.2.9, “SELECT Syntax”.)
11.05.2011
Marco Rieger 820 8
1
Was die Performance betrifft, habe ich einen Testlauf mit einer ASA 9 Datenbank (Sybase) gemacht. Die Testumgebung sah dabei wie folgt aus:

- ASA 9 Datenbank
- Verbindung via ODBC
- Datenbank auf Server im Netzwerk
- Anbindung 1 GBit

Das Ergebnis: *UPDATE*

SELECT * FROM pers JOIN pers_tel ON (pers.nr = pers_tel.pers_nr AND pers.typ = pers_tel.pers_typ) WHERE pers.nr > 1;
1. Ausführungszeit: 13,753 Sekunden
2. Ausführungszeit: 13,225 Sekunden
3. Ausführungszeit: 13,434 Sekunden

SELECT * FROM pers, pers_tel WHERE pers.nr = pers_tel.pers_nr AND pers.typ = pers_tel.pers_typ AND pers.nr > 1;
1. Ausführungszeit: 13,514 Sekunden
2. Ausführungszeit: 13,610 Sekunden
3. Ausführungszeit: 13,225 Sekunden


*UPDATE*
Also rein von der Perfomanz her, kein gewaltiger Unterschied. Tabelle pers hat ~50.000 Einträge und pers_tel ~200.000. Im Durchschnitt war das SELECT mit der WHERE-Verkettung minimal schneller, was ich jetzt aber nicht als performanter bewerten würde.
12.05.2011
Dustin Klein 2,9k 2 9
Vielen Dank! Deine Zahlen sind sehr hilfreich. Ich habe ergänzend gerade gelesen, dass die "WHERE"-Alternative erheblich weniger Speicherlast erzeugt.
doublem 12.05.2011
Ja, das ergibt sich aus dem Verbund zweier Tabellen. Das Join hält dabei, soweit ich weiß, beide Tabellen erstmal vollständig im Speicher und stellt dann die Verknüpfung her, was zu größerem Speicherhunger führt.
Dustin Klein 13.05.2011
Gilt das mit dem Speicherhunger auch noch, wenn man explizit einen INNER JOIN vorgibt? Auf http://www.sql-server-performance.com/forum/threads/where-or-inner-join.16695/ behauptet ein SQL Server MVP, dass (zumindest beim SQL Server) die where- und die inner-join-Syntax äquivalent sind.
Matthias Hlawatsch 20.07.2011

Stelle deine Mysql-Frage jetzt!