ORA-02395: превышен лимит вызовов при использовании ввода-вывода и использовании курсоров в качестве альтернативы - PullRequest
0 голосов
/ 19 июня 2020

У меня есть запрос PL SQL, который имеет MINUS.

 select id from small_table where col ='xxx' 
     MINUS 
select id from large_table;

large_table имеет 139070 строк, а small_table имеет 7459 строк. Я получаю ORA-02395: exceeded call limit on IO usage при выполнении. Я пробовал заменить MINUS на not in и not exists. Я прочитал об ошибке и не могу договориться с DBA, чтобы изменить LOGICAL_READS_PER_CALL. Теперь могу ли я использовать 2 курсора для извлечения данных из 2 таблиц, а затем выполнить MINUS эквивалент logi c на стороне PLSQL? Или я получу ORA-02395 даже с курсором logi c. Или я могу переписать сам запрос?

Кроме того, какое максимальное количество строк можно получить с помощью курсора, используя BULK COLLECT INTO a table OF ***.

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Вы можете попробовать это:

select s.id
from small_table s
left join big_table b
on s.id = b.id
where b.id is null
and s.col = 'xxx'
0 голосов
/ 19 июня 2020

Если очевидное решение (согласование с вашим администратором баз данных) невозможно, вам нужно будет реорганизовать ваш запрос, чтобы уменьшить количество сканируемых блоков. Для этого требуется понимание объема и распределения ваших данных. Является ли программа частью программного обеспечения, которое работает в производственной системе? У вашего пользователя есть ограничение ресурсов профиля, чтобы вы не могли преодолеть системные ресурсы. Какое объяснение ваш dba дал вам отклонить ваш запрос?

Вы можете использовать BULK COLLECT INTO с предложением LIMIT. Это предложение ограничивает количество строк, однако этот метод даже требует больших ресурсов. Так что я не верю, что это сработает.

Не видя всю свою программу, очень сложно найти обходной путь для ограничения вашего профиля.

...