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
Self-Join explodiert
Moderator: Moderatoren
Re: Self-Join explodiert
Aloha
Poste doch mal Deine Abfrage und/oder lad eine Beispieldatenbank hoch.
Je nach WHERE-Klausel muss das ja unter Umständen auch erst getan werden, das hat erstmal nichts mit der HSQLDB zu tun.Proton hat geschrieben:Offensichtlich macht HSQLDB erst das Kreuzprodukt bevor aussortiert wird.
Poste doch mal Deine Abfrage und/oder lad eine Beispieldatenbank hoch.
Re: Self-Join explodiert
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
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
mfg
Proton
Proton
Re: Self-Join explodiert
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
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.
Mit derart vagen Angaben lässt sich da nur im Dunkeln rumstochern, aber vom ersten Eindruck her sollte es mit einer eindeutigen Zuordnung wie
kein Kreuzprodukt geben.t1.c1 = t2.c1
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
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
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

mfg
Proton
Proton