Разработчик показал случай тормозящей вставки в одну таблицу. Время от времени такая вставка вылетала с сообщением об ошибке ORA-06550: program too large (codegen operands)
Проверил у себя на тесте, на одиночные вставки с коммитом в конце 50 тыс строк одной транзакцией было затрачено времени менее 1 мин. Тем же способом 1 млн строк вставились примерно за 40 мин.
Оказывается, вставки запускались по шаблону:
Код: Выделить всё
begin
INSERT ...
<50 тыс команд INSERT>
commit;
exception
when others then
dbms_output.put_line('Error: ' || sqlerrm);
rollback;
end;
/
Во время работы вставки в БД ждала неактивная сессия с событием ожидания SQL*Net message from client
Трасировка 10046 показала, что основное время вставки даже 50 тыс строк проводят на долгом парсинге:
Код: Выделить всё
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 371.66 372.00 0 0 0 0
Execute 1 5.24 5.30 0 0 0 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 376.90 377.30 0 0 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 1250
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
PGA memory operation 246 0.16 0.17
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 0.00 0.00
********************************************************************************