У вас есть возможность изменить сгенерированный запрос? Похоже, что он делает постороннее соединение с таблицей ALL_OBJECTS
. Похоже, что ваш запрос эквивалентен этому
SELECT a.argument_name,
a.data_type,
a.in_out,
NVL (a.data_length, 0) AS data_length,
NVL (a.data_precision, 0) AS data_precision,
NVL (a.data_scale, 0) AS data_scale
FROM ALL_ARGUMENTS a,
(SELECT object_id
FROM all_objects
WHERE UPPER (object_name) = UPPER ('resourcemanager_pkg')
AND object_type = 'PACKAGE'
AND owner = 'OFFICEDBA') o
WHERE UPPER (a.object_name) = UPPER ('p_search_roles')
AND a.OBJECT_ID = o.OBJECT_ID
ORDER BY a.position ASC
Я бы также ожидал, что использование ALL_PROCEDURES
вместо ALL_OBJECTS
для получения OBJECT_ID
будет более эффективным.
Вы собрали словарную статистику? Запросы к представлениям словаря данных, как правило, довольно сложно настроить, поскольку вы не можете добавлять индексы или другие структуры, чтобы ускорить процесс. Но, по крайней мере, сбор словарной статистики может дать оптимизатору лучшую информацию, чтобы можно было выбрать лучший план.
Наконец, возможно ли, что вы могли бы материализовать данные из словаря данных в материализованном представлении, которое периодически обновляется, чтобы вы могли индексировать? Это будет означать, что результаты не будут сразу отражать изменения в определении процедур. С другой стороны, вы обычно не хотите вносить изменения в определения процедур в режиме реального времени, и вы всегда можете обновить материализованные представления после внесения изменений в схему.