Наиболее естественным объяснением наблюдаемого поведения является то, что количество обрабатываемых строк (process_data
) варьируется.
Общее прошедшее время линейно пропорционально числу обработанных строк, поэтому в дни с большим количеством строк цикл "зависает".
Лучший способ ускорить работу - не использовать FOR LOOP
в PL / SQL.
Просто переформулируйте его в операторе SQL (это не всегда возможно, иногда приводит к сложному SQL, но может привести к резкому ускорению.
В вашем случае это должно быть довольно простое упражнение:
Этот запрос возвращает тот же результат, что и ваш первый цикл.
SELECT e.employee_plan_id
FROM process_data p
JOIN employee e ON p.emp_id = e.employeeid
JOIN employeedata ed ON p.emp_id = ed.employeeid
AND p.joining_date BETWEEN ed.join_date AND ed.termination_date;
Соответственно, вы можете переписать всю процедуру одним оператором UPDATE.
UPDATE process_data
SET is_failure = 1
WHERE emp_lastname IS NULL
AND emp_plan_type IN (
SELECT employee_plan_type
FROM employee_plans
WHERE employee_plan_id IN (
/* copy the query above here */
)
);