В системе при удалении строк из огромной вьюхи с триггерами раз в 2 часа выскакивала ошибка
ORA-04030: out of process memory when trying to allocate 32780 bytes (kxs-heap-b,bind var buf)
Параметр в скобках периодически менялся, сообщая о невозможности выделить памяти то в одной, то в другой области.
Исследование ошибки начал с
select * from v$process order by pga_used_mem DESC
В чемпионах сессия, которая удаляет данные.
Далее делаю
SELECT * FROM v$process_memory ORDER BY max_allocated DESC NULLS LAST;
получаю, что больше всего памяти выделено в сессии под CATEGORY SQL
Выполняю
SELECT * FROM v$process_memory_detail;
Пусто :(.
В ходе поисков решения натыкаюсь на отличную статью
Делаю
SELECT * FROM V$SQL_WORKAREA_ACTIVE;
Пусто, не мой вариант. У меня нет ни сортировок, ни хешей, ни битовых индексов.
Но далее в статье решение. Для того, что бы увидеть данные в v$process_memory_detail, нужно сказать ораклу, чтобы он их заполнил
SQL> ORADEBUG SETMYPID
Statement processed.
SQL> ORADEBUG DUMP PGA_DETAIL_GET 24
Statement processed.
и в v$process_memory_detail нахожу, что больше всего места занимает heap kxt.c: PL/SQL pgadef и ноту на метлинке PLSQL performance on 11.1.x much slower than previous DB versions (Doc ID 739064.1)
На лицо мой баг в Oracle 11.1.0.6
После применения рекомендованых
ALTER SYSTEM SET session_cached_cursors=0 SCOPE=SPFILE;
ALTER SYSTEM SET cursor_space_for_time=FALSE SCOPE=SPFILE;
все заработало как надо