Si está usando 10g o posterior, puede hacer que la función CONCAT() sea un poco más eficiente usando el operador MULTISET UNION:
FUNCTION concat (
iList1 IN ID_ARRAY,
iList2 IN ID_ARRAY
)
RETURN ID_ARRAY IS
lConcat ID_ARRAY;
BEGIN
lConcat := iList1
MULTISET UNION
iList2 A
;
RETURN lConcat;
END concat;
Podría hacer las cosas más eficientes completando varias matrices diferentes y luego llamando a MULTISET UNION una vez para todas ellas:
lConcat := iList1
MULTISET UNION
iList2
MULTISET UNION
iList3
MULTISET UNION
iList4;
Usando SQL dinámico, presumiblemente para reemplazar los diversos get_idsN()
funciones:podría ser un enfoque que valga la pena investigar, pero probablemente no le dará mucho, si es que le da algo, en la forma de mejorar el rendimiento.
Las tablas temporales no son una buena idea, porque funcionan muy mal en comparación con hacer cosas en la memoria.