WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 13.03.2008, 14:11   #1
Nestrus
Elite
 
Registriert seit: 01.07.2000
Alter: 40
Beiträge: 1.400


Nestrus eine Nachricht über ICQ schicken
Standard Oracle: Wie mache ich mehrfachen self-join möglichst perfomant?

Hallo,

ich hab auf einem Oracle 9i Server eine Tabelle mit Teilstrecken die ca. so aussieht (ich stell hier alles vereinfacht dar):

PK, FK, Hinweg (1= Hin, 2= Rück), lfdNr, von, nach

Jetzt sollte ich einen Teil der Daten so aufbereiten, das der gesamte Weg in einer Zeile steht, also alle Teilstrecken nacheinander. (Wenns 2 Hin- und 2 Rückwege gibt: PK, h1von, h1nach, h2von, h2nach, r1von, r1nach, r2von, r2nach) Das macht in einer Datenbank sehr wenig Sinn, aber ich muss es so auswerten, dass alle Infos eines Weges in einer Zeile stehen.

Zuerst habe ich probiert eine neue Tabelle zu machen:
create temp_wege as
select * from teilstrecken where hinweg = 1 and lfdnr = 1;
Dazu habe ich die Spalten für die weitern Wege getan und diese befüllt
update temp_wege set
h1von = (select von from teilstrecken where teilstrecken.fk = temp_wege.pk and hinweg = 1 and lfdnr = 1),
h1nach = (select nach from teilstrecken where teilstrecken.fk = temp_wege.pk and hinweg = 1 and lfdnr = 2); usw.
Das war allerdings sehr langsam.

Als nächstes probierte ich ganz viele joins zu schachteln:
select a.*, b.von as h2von, b.nach as h2nach from (
select a.*, b.von as h1von, b.nach as h1nach from (
select pk, weiter felder
from teilstrecken) a left join teilstrecken b on a.pk = b.pk
where b.Hinweg = 1 and b.lfdnr = 1) a left join teilstrecken b on a.pk = b.pk)
where b.Hinweg = 1 and b.lfdnr = 2;

Das war aber noch schlimmer, hier hab ich nach mehreren Stunden ohne Ergebnis abgebrochen.

Weiß jemand, wie ich das lösen könnte?

Vielen Dank im Voraus für die Hilfe. Ich hoffe, ich habe alles halbwegs verständlich geschildert!


Schöne Grüße
Nestrus
____________________________________
"reden 2 unsinn im wcm forum, meint der dritte is eh offtopic"
(Gifty am 14. Apr 2002 um 22:47 in " WCM Rat & Tat Forum > Meinung > Guru, e-Zitate & Off Topic > Kommt ein Mann zum Arzt...")
Nestrus ist offline   Mit Zitat antworten
Alt 17.03.2008, 12:59   #2
SerenDwyn
Master
 
Registriert seit: 20.11.2005
Beiträge: 748


Standard

Mir fällt da jetzt auch keine Lösung ein, aber hoffentlich den Profis dort: Oracle Forum
SerenDwyn ist offline   Mit Zitat antworten
Alt 17.03.2008, 14:37   #3
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

ich würde das nicht über ein statement lösen, sondern prozedural mittels PL/SQL (oder java ) ...

1.) alle "erststrecken" ermitteln (... where FK is null) und durchloopen
2.) zur jeweiligen erststrecke die zusatzstrecken suchen und die gewünschte verarbeitung durchführen

soferne die zusatzstrecken wiederum weitere zusatzstrecken haben, könnte man punkt 2 auch noch rekursiv aufrufen solange ...

vorteile:
die pro schritt zu verarbeitenden datenmengen sind gering, da
a.) die erststrecken über den index der foreign-key-column ermittelt werden
b.) die teilstrecken über den index der primary-key-column sehr performant selektiert werden
____________________________________
Praktizierender Eristiker

No hace falta ser un genio para saber quién dijo eso.
Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein.
pc.net ist offline   Mit Zitat antworten
Alt 19.03.2008, 17:48   #4
Nestrus
Elite
 
Registriert seit: 01.07.2000
Alter: 40
Beiträge: 1.400


Nestrus eine Nachricht über ICQ schicken
Standard

Es wäre schon gut, wenn ich alle Felder einer Teilstrecke auf ein Mal updaten könnte, das ich für jede Teilstrecke fünf Fehler einfügen muss...

@SerenDwyn: Danke für den Link, sollte ich nicht bald eine Lösung finden, werde ich mal dort fragen.

@pc.net: Ich verstehe leider nicht wirklich wie du das meinst, kannst du einen Beispielcodeschnipsel posten?
Die Erststrecke ist meist (ein paar haben nur einen Rückweg, aber die kann ich dann extra behandeln) die mit Hinweg=1 und lfdNr=1, die nächste wäre dann eben die mit dem gleichen fk und Hinweg=1 und lfdNr=2.
____________________________________
"reden 2 unsinn im wcm forum, meint der dritte is eh offtopic"
(Gifty am 14. Apr 2002 um 22:47 in " WCM Rat & Tat Forum > Meinung > Guru, e-Zitate & Off Topic > Kommt ein Mann zum Arzt...")
Nestrus ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:58 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag