I changed the statement that is used internally.
At least on my test database running 19c this did show some improvement - although even with over 1000 procedures and function, it took only about 4 seconds before.
The new version got this down to less than 1 second.
Would you mind running that on your system to see if that improves things for you as well?
select *
from (
select null as package_name,
user as procedure_owner,
ao.object_name as procedure_name,
null as overload_index,
null as remarks,
decode(ao.object_type, 'PROCEDURE', 1, 'FUNCTION', 2, 0) as PROCEDURE_TYPE,
ao.status,
ap.pipelined
from user_objects ao
left join user_procedures ap on ao.object_name = ap.object_name
where ao.object_type in ('PROCEDURE', 'FUNCTION')
UNION ALL
select package_name, procedure_owner, procedure_name, overload_index, remarks, procedure_type, status, pipelined
from (
select ap.object_name as package_name,
user as procedure_owner,
ap.procedure_name,
ap.overload as overload_index,
decode(ao.object_type, 'TYPE', 'OBJECT TYPE', ao.object_type) as remarks,
decode(aa.anz, 1, 2, 1 ) as procedure_type,
ao.status,
ap.pipelined,
row_number() over (partition by ap.object_name, ap.procedure_name, ap.overload order by ao.object_type desc) as rn
from user_procedures ap
join user_objects ao on ap.object_name = ao.object_name
left join (
select owner, package_name, object_name, overload, count(*) as anz
from all_arguments
where in_out = 'OUT'
and argument_name is null
group by owner, package_name, object_name, overload
) aa on aa.package_name = ap.object_name
and aa.object_name = ap.procedure_name
and coalesce(aa.overload,'none') = coalesce(ap.overload, 'none')
where ao.object_type IN ('PACKAGE BODY', 'PACKAGE', 'TYPE', 'OBJECT TYPE')
and ap.procedure_name is not null
and ap.object_name is not null
)
where rn = 1
)
ORDER BY 2,3,4