Manera rápida de generar cadenas concatenadas en Oracle

¿No odiamos cuando la codificación malvada vuelve a perseguir?

Hace algún tiempo necesitaba generar una cadena que concatenara algunos campos para más procesamiento posterior. Pensé que sería una buena idea hacerlo directamente en la consulta, y utilicé la ayuda de SO para obtenerlo. Funcionó. Por un momento..

La mesa se hizo grande y ahora ese truco (que sé que es súper ineficiente) no es exactamente viable. Esto es lo que estoy haciendo:

with my_tabe as
(
    select 'user1' as usrid, '1' as prodcode from dual union
    select 'user1' as usrid, '2' as prodcode from dual union
    select 'user1' as usrid, '3' as prodcode from dual union
    select 'user2' as usrid, '2' as prodcode from dual union
    select 'user2' as usrid, '3' as prodcode from dual union
    select 'user2' as usrid, '4' as prodcode from dual
)
select
    usrid,
    ltrim(sys_connect_by_path(prodcode, '|'), '|') as prodcode
from 
    (
    select distinct prodcode, usrid,count(1)
    over (partition by usrid) as cnt,
    row_number() over (partition by usrid order by prodcode) as rn
    from my_tabe 
    )
where
    rn = cnt 
start with rn = 1
connect by prior rn + 1 = rn
and prior usrid = usrid

Que produce muy bien:

USRID   PRODCODE
user1   1|2|3
user2   2|3|4

a cosa malvada aquí, como habrás notado, es lawhere rn = cnt, que si eliminas verás todo el trabajo (supongo) Oracle realmente está haciendo:

USRID   PRODCODE
user1   1
user1   1|2
user1   1|2|3
user2   2
user2   2|3
user2   2|3|4

Realmente estoy usando esto en muchos lugares donde no tengo tantos registros. Está bastante bien hasta aproximadamente medio millón de registros.

Recientemente intenté lo mismo en una tabla con ~ 15Mi registros, y bueno ... no es bueno.

Pregunta: ¿hay alguna manera de hacer esto de manera más eficiente en Oracle o es hora de reducirlo al código real? Este no es un problema central real, por lo que todavía puedo permitirme kludging, siempre que sea rápido ... Vale la pena mencionar que hay un índice para la columna "usrid" que estoy usando.

aclamaciones

Respuestas a la pregunta(1)

Su respuesta a la pregunta