Self-Join explodiert

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Self-Join explodiert

Re: Self-Join explodiert

von Proton » Sa, 28.05.2011 15:37

Hallo

Inzwischen habe ich die Lösung über ein Tutorium gefunden und evaluiert. Das ist der gleiche Ansatz wie von DPunch:

select * form
--t as t1 (sattdessen eine temp. Tabelle mit maximal restriktiver where- Klausel, nur 100 Zeilen anstelle von 500 und mehr)
(select * from t
where
... maximale Einschränkung für die temp. Tabelle t1
) t1,

-- t as t2 (und hier das Gleiche)
(select * from t
where
... maximale Einschränkung für die temp. tabelle t2
) t2

where --
... Einschränkung für den Join t1 x t2

Im Ergebnis geht die Antwortzeit von 100 s auf 15 s zurück.

Vielen Dank für die Diskussion

mfg
Proton :D

Re: Self-Join explodiert

von DPunch » Mi, 25.05.2011 17:07

Aloha

Mit derart vagen Angaben lässt sich da nur im Dunkeln rumstochern, aber vom ersten Eindruck her sollte es mit einer eindeutigen Zuordnung wie
t1.c1 = t2.c1
kein Kreuzprodukt geben.

Du kannst mal schauen, ob eine Umstellung ala

(...)
from t as t1 JOIN t as t2 ON t1.c1 = t2.c1
where
t1.c2 = irgendwas
and t1.c3 = irgendwas
(...)

Abhilfe schafft.

Re: Self-Join explodiert

von Proton » Mi, 25.05.2011 16:46

Eigentlich ganz einfach:
create table t c1, c2, c3, c4, c5, ….;

select
t1.c1, t1.c2, t1.c3, -- Klassifizierungen wie Datum, Messwerttyp, usw.
t2.c4 – t1.c4 -- Messwertdifferenzen
t2.c5 – t1.c5

from t as t1, t as t2 -- Self-Join Tabelle t mit sich selbst als t1 und t2
where 1 = 1
and t1.c1 = t2.c1
and t1.c2 = irgendwas
and t1.c3 = irgendwas

order by irgendwas;

bei 500 Zeilen von t ergeben sich 500 * 500 = 250.000 Zeilen als Kreuzprodukt. Laufzeit ca. 90s. Ich befürchte, dass das nicht mehr lange geht, da t weiterwächst.

mfg
Proton

Re: Self-Join explodiert

von DPunch » Mi, 25.05.2011 14:35

Aloha
Proton hat geschrieben:Offensichtlich macht HSQLDB erst das Kreuzprodukt bevor aussortiert wird.
Je nach WHERE-Klausel muss das ja unter Umständen auch erst getan werden, das hat erstmal nichts mit der HSQLDB zu tun.

Poste doch mal Deine Abfrage und/oder lad eine Beispieldatenbank hoch.

Self-Join explodiert

von Proton » Mi, 25.05.2011 13:57

Hallo Forum

Mein Self-Join explodiert. Weil die Tabelle inzwischen über 500 Zeilen hat, kommen jetzt wohl 250.000 Zeilen zusammen, obwohl die where-Klausel nur 100 Treffer zulässt.

Offensichtlich macht HSQLDB erst das Kreuzprodukt bevor aussortiert wird. Überlegungen mittels Subquery in der where-Klausel greifen nicht.

Hat jemand eine Idee?

Fachlich geht es um Zählerstände, die regelmässig erfasst werden. Jede zeile enthällt 10 Messwerte verschiedener Zähler. Die Auswertung soll immer die Differenzen zum nächsten relevanten Wert liefern.

Danke für die Resonanz
Proton

Nach oben