Vinzenz Mai: Performanceproblem: korreliertes Subselect auf Selfjoins

Beitrag lesen

Hallo,

das sieht nach einer korrelierten Unterabfrage aus, siehe z.B:

</archiv/2006/7/t133015/#m861544>
</archiv/2008/1/t165377/#m1078290>

Vielen Dank für deine Antwort damit hätte ich es theoretisch geschafft! Nur nicht praktisch, da warte ich seit 30 Minuten oder so auf das Ergebnis, wobei die Tabelle nur 300 Einträge hat!

SELECT
t.topic_textID,
prev.topic_textID AS prev,
prev.level_order AS prev_order,
next.topic_textID AS next,
next.level_order AS next_order,
FROM temp_topics AS t
LEFT JOIN temp_topics AS prev ON t.level = prev.level AND prev.level_order < t.level_order
LEFT JOIN temp_topics AS next ON t.level = next.level AND next.level_order > t.level_order
WHERE t.level != ''
ORDER BY topic_textID, prev_order DESC, next_order ASC

Du hast da einen doppelten Selfjoin, auf den ein korreliertes Subselect zu setzen ist noch unperformanter als Selfjoin und korreliertes Subselect, die einzeln schon nicht zum performantesten gehören.

Und nun braucht die Abfrage schon 30 Minuten natürlich mit maximaler CPU Last. Und das nur wegen der ISNULL Abfrage :-(

Hast du eine Ahnung wie man das beschleunigen könnte? Und wieso das so langsam ist?

Die Echtdaten haben dann 20000 Einträge und das ganze muss unter 5 Minuten ablaufen... :-/

Ein Vorschlag wäre, eine temporäre Tabelle zu nutzen:
Selektiere Deine Daten (ohne korrelierte Unterabfrage) in eine temporäre Tabelle. Setze die korrelierte Unterabfrage auf die temporäre Tabelle ab.
Lösche danach die temporäre Tabelle.

Freundliche Grüße

Vinzenz