Michael Schröpl: & (MySQL) Komplizierter Query

Beitrag lesen

WHERE ausschreibung.ausart = 'gesuch' AND berufsgruppezw.berufsgruppeid = '11' OR berufsgruppezw.berufsgruppeid = '12' AND spezialbereichzw.spezialbereichid = '16' OR spezialbereichzw.spezialbereichid = '5' AND regionzw.regionid = '11' OR regionzw.regionid = '6' AND artzw.artid = '6' OR artzw.artid = '7';

Puh. Kannst Du diesen Ausdruck mal klammern? Mit Prioritäten von Operatoren habe ich es nicht so ...

Wenn Du "artid = 6 OR 7" haben willst, dann müßte eigentlich auch "artid in (6, 7) gehen (und wahrscheinlich schneller sein).

Durch den Join über 5 Tabellen ist das ganze aber so dermassen langsam das so ein query direkt an den mysql client abgegeben ca. 5 minuten braucht, gibt es da auch einen anderen weg?

Kess' Idee mit Zwischentabellen ist für Performance sicher gut (für Parallelität natürlich eine Katastrophe, wenn zwei Benutzer dieselbe Tabelle anlegen wollen - hoffentlich brauchst Du so etwas nicht). Echt temporäre (prozeßlokale) Tabellen kenne ich in SQL nicht.

Es kann übrigens gut sein, daß Du durch die *Reihenfolge* der Joins bzw. der Ausdrücke in der Where-Klausel die Geschwindigkeit massiv beeinflussen kannst. (Ein wirklich guter Optimizer sollte das eigentlich selbst richtig machen, aber wo gibt es den schon?) Der Trick ist, daß Du die stark projezierenden JOINs zuerst machst, um die Treffermenge insgesamt einzuschränken - und was bei Dir wie stark projeziert, darüber hat auch ein guter Optimizer (Kommando ANALYZE TABLE in Oracle) bestenfalls statistische Informationen.

Ich habe mal in Oracle zwei Tabellen, die ich fast nur mit einem gemeinsamen JOIN über Primärschlüsselattribute anspreche, in einen CLUSTER gelegt, d. h. die Datensätze beider Tabellen werden so physikalisch gespeichert, daß sie in einem gemeinsamen Segment über den JOIN-Schlüssel adressiert werden können (das minimiert die Kopfbewegungen der Platte usw.). Oracle kann so etwas halt ... aber mySQL ... ?