Ich versuche, eine hierarchische Struktur auf Orakel gehen und ich habe ernsthafte Probleme mit der Leistung. Dies ist mein Code:Die Verwendung eines Feldes in Update drastisch verlangsamt die Abfrage
UPDATE {table} t1
SET (t1.{column2}) = (
SELECT max(t2.{date}) FROM {table2} t2
WHERE t2.{column} in(
SELECT t3.{column}
FROM {table3} t3
START WITH t3.{columnt3} = 'blablabla'
CONNECT BY t3.{columnt3} = PRIOR t3.{column}
))
WHERE t1.{column1} = 'blablabla'
Dieser Code funktioniert und läuft unter einer Sekunde. Ersetzen Sie jetzt die erste 'blablabla' mit t1. {Spalte1} (diese beiden sind äquivalent) ergibt mehr als eine Minute Ausführungszeit. Der Code sieht dann wie folgt aus:
UPDATE {table} t1
SET (t1.{column2}) = (
SELECT max(t2.{date}) FROM {table2} t2
WHERE t2.{column} in(
SELECT t3.{column}
FROM {table3} t3
START WITH t3.{columnt3} = t1.{column1}
CONNECT BY t3.{columnt3} = PRIOR t3.{column}
))
WHERE t1.{column1} = 'blablabla'
Weiß jemand, den Grund für dieses seltsame Problem?
Edit: Hier ist der Plan für die obere (die Arbeits) Abfrage erklären: first explain plan
Und hier die man für die zweite (die gebrochen) Abfrage: second explain plan
Wie Sie kann sehen, die Laufzeit explodiert gerade durch das Durchsuchen von t2, einem sehr großen Tisch. Aber warum passiert das? Und gibt es einen Grund, warum das passiert?
Edit 2:
Vielleicht der ursprünglichen Code hilft ein bisschen mehr:
UPDATE tmp_obsolete t1
SET (liefertermin) = (
SELECT max(versand_termin) FROM ropd7.pkvp
WHERE artikel_nr in(
SELECT pstp.artikel_nr
FROM ropd7.pstp
START WITH pstp.komponenten_art_nr = 'XX.XX.XX.XX.XX'
CONNECT BY pstp.komponenten_art_nr = PRIOR pstp.artikel_nr
))
WHERE t1.artikel_nr = 'XX.XX.XX.XX.XX';
UPDATE tmp_obsolete t1
SET (liefertermin) = (
SELECT max(versand_termin) FROM ropd7.pkvp
WHERE artikel_nr in(
SELECT pstp.artikel_nr
FROM ropd7.pstp
START WITH pstp.komponenten_art_nr = t1.artikel_nr
CONNECT BY pstp.komponenten_art_nr = PRIOR pstp.artikel_nr
))
WHERE t1.artikel_nr = 'XX.XX.XX.XX.XX';
Haben Sie die Ausführungspläne verglichen? –
'CONNECT BY t3. {Columnt3} = t3. {Spalte}' ist diese Zeile korrekt? Normalerweise erwarten Sie, dass das PRIOR-Schlüsselwort irgendwo drin steht. I.e. 'CONNECT BY PRIOR t3. {Columnt3} = t3. {Spalte}' oder 'CONNECT BY t3. {Columnt3} = PRIOR t3. {Spalte}', je nachdem, wie Ihre Hierarchie definiert ist – Boneist
@WernfriedDomscheit: ja, ich habe sie verglichen und der spätere explodierte gerade. Aber das hilft nicht sehr, denn ich kann immer noch nicht erklären, warum das passiert. –