Keresés

Új hozzászólás Aktív témák

  • Apollo17hu

    őstag

    válasz Ispy #4168 üzenetére

    Az a gond, hogy nem végtáblában van szükségem az eredményre, mert egy automatizmus a további feldolgozás során használja.

    @bpx: Próbálkoztam a NO_MERGE hinttel, de egyelőre sikertelenül. :(

    A kód egyébként kb. így néz ki:

    WITH
    t1 as (...),
    t2 as (...),
    ...
    t20 as (...)

    SELECT ...
    FROM /*+ no_merge (t1 t2 ... t20) */
    t1,
    t2,
    ...,
    t20,
    () as tx
    WHERE
    tx.mezo = t1.mezo(+) AND
    tx.mezo = t2.mezo(+) AND
    ...
    tx.mezo = t20.mezo(+)

    Próbáltam LEFT JOIN szintaxisra is átírni a (+) kötéseket, de az sem segített.
    A WITH-del lehet probléma? Azt olvastam, hogy még segít is az optimizer-nek, mert a legtöbb esetben előbb külön-külön számítja ki a WITH-ben lévő allekérdezések eredményét, és csak utána használja őket.

    Hogy érthető legyen: mondjuk t3-at, t7-et és t8-at cseréltem ki. Külön-külön minden t tábla minimális idő alatt lefut, néhányszáz sort eredményeznek. Ha csak t3-at (vagy csak t7-et vagy csak t8-at) cserélem ki, akkor 1 perc alatt lefut a kód. Ha már két táblát is kicserélek, akkor nem.
    Sőt, ha lebutítom így a kódot:

    WITH
    t3 as (...),
    t7 as (...)

    SELECT ...
    FROM
    t3,
    t7,
    () as tx
    WHERE
    tx.mezo = t3.mezo(+) AND
    tx.mezo = t7.mezo(+)

    már ez sem fut le. Tehát a 3 új allekérdezés valahogy "összeakad", pedig <1 perc a futási idejük külön-külön.

Új hozzászólás Aktív témák