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.