У меня проблемы с пониманием того, как параллельные вставки работают в данном сценарии: у нас есть 2 отдельные процедуры (p1, p2). Обе процедуры вставляют данные в одну и ту же таблицу.
Если p1 работает с, скажем, 30k вставками, это будет успешным примерно через 1 ч - 1 ч 30 мин. Процедура p1 использует insert all into
, и внутри у нас есть 2 вставки (одна из которых находится на упомянутой таблице). В таблице также есть триггер вставки (400 строк кода с различной проверкой).
Однако, если p2 попытается выполнить хотя бы одну вставку, вставка p2 будет выполнена мгновенно, но вставка p1 завершится sh через 5 часов или около того. , P2 использует ту же таблицу, но сначала он выберет тип строки, а затем вставит int в таблицу.
Таким образом, вопрос: если это происходит из-за того, что база данных делает вид моментального снимка, потому что выполняется тяжелая операция, а другой делает выбор и вставку одновременно?
РЕДАКТИРОВАТЬ: не знаю, может ли это быть важным, но таблица имеет 21 индекс.
Также стоит отметить, что у проблемной_таблицы есть дата изменения. Дата модификации на всех 30к или 60к одинакова. Поэтому я считаю, что SYSDATE хранится в памяти внутри вставки всех в вызов.
Эта другая вставка из P2 происходит, скажем, через 0,5 часа после вставки всего и всегда фиксируется сразу после ее вызова. Также важно то, что P2 делает вставку, используя выбранную строку из problemmatic_table. Он хранит его как ROWTYPE.
insert all into problematic_table (column1, columnN, column37)
values (sequence.nextval,
sequence.currval,
some_data_hard_typed,
SOME_DATA_COLUMNS_FROM_LAST_SELECT)
into another_table (c1, columnN, c32)
values (v1,
valueN,
some_data_hard_typed,
SOME_DATA_COLUMNS_FROM_LAST_SELECT)
(select c1, c2..c29 from temp_table_used to insert)