2016-11-10 5 views
0

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

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 вставьте назначение. Однако я теряю Logging & Отслеживание отдельной записи.
  2. Для Loop: Я использовал For Loop, как указано выше. Но это слишком долго. Увеличение времени выполнения.

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

Thanx заранее.

+0

Дополнительная информация. Количество записей в Order_Master составляет около 50-60 тыс., А Product_Master - около 200-220 тыс. – Debabrata

+0

Что делает вариант 2 медленным? Это также медленно, если вы удалите журнал? – Rene

+0

№ Без регистрации часть, это намного быстрее. Хотя это не так быстро, как вариант 1. – Debabrata

ответ

0

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

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

Если вы решите решение для массового сбора, использование FORALL (несколько раз) также было бы возможно, если бы вы ввели вкладки для входа в систему самостоятельно, поскольку при вызове процедуры она не будет ускоряться - она ​​предназначена для создания DML statements that would have been executed one row at a time и исполнить их вообще.

Смежные вопросы