Регистрация отдельных записей при обработке большого количества записей

У меня есть процедура, которая назначит продукты по существующему списку заказов.

For rec_ord in(Select Order_ID,Order_Prop1,Order_Prop2,<some more columns> 
               from Order_Master Where <Some Conditions>)
Loop
<Step-1:Do some Processing on Order_Prop1,Order_Prop2>
[Log the Processing Result]
For rec_prod in (Select Prod_ID,Prod_Prop1,Prod_Prop2,<some more columns> 
                 from Product_Master 
                 Where Prod_Prop1 = Ord_Prop1
                 and <Some Conditions>)
Loop
<Step-2:Do Some Processing using Prod_Prop2 and Order_Prop2>
[Log the Processing Result]
<Decide Whether to Assign or Not>
[Log the assignment or non-assignment with reason]
End Loop
End Loop

Я попробовал ниже 2 метода.

  1. Массовый сбор: я объединил шаги 1 и 2 в одном запросе, объединив Order_Master & Product_Master. А затем, используя Bulk-Collect, вставьте назначение. Однако я теряю регистрацию и отслеживание отдельных записей.
  2. Для Loop: Я использовал For Loop, как указано выше. Но это занимает слишком много времени. Увеличение моего времени выполнения во много раз.

Я хочу, чтобы обработка выполнялась быстро вместе с регистрацией и отслеживанием. Любая помощь приветствуется.

Спасибо заранее.

1 ответ

Для меня проблема здесь заключается в том, что вы пытаетесь объединить обработку массива строк с однорядной регистрацией. Это приводит к очень низкой производительности, поскольку Oracle вынуждена постоянно переключаться между PL/SQL и SQL-движком.

Следовательно, возможным решением будет сбор информации о регистрации в массиве. TYPE t_logs IS TABLE OF reasonable_rec_log_type и передать его в процедуру регистрации сразу или порциями (время от времени) (во внешнем цикле?), в зависимости от предполагаемых размеров таблицы.

Если вы выберете решение для массового сбора, использование FORALL (несколько раз) также будет возможно, если вы сами сделали Inserts для регистрации, так как он не будет ускоряться при вызове процедуры - он предназначен для генерации операторов DML, которые были бы выполняется по одной строке за раз и выполняет их в целом.

Другие вопросы по тегам