В базе данных имеется около 120 тыс. Записей, и на основе нескольких функций я вычисляю баллы для всех записей, еженедельно мне приходится обновлять таблицу новыми записями и соответствующими баллами.
Ниже приведена процедура который я использую для объединения данных в таблицу:
create or replace procedure scorecalc
AS
score1 number;
score2 number;
score3 number;
CURSOR cur IS
SELECT Id_number from tableA;
r_num cur%ROWTYPE;
BEGIN
--OPEN cur;
FOR r_num IN cur
LOOP
select functionA(r_num.id_number),functionb(r_num.id_number),functionc(r_num.id_number) into score1, score2,score3 from dual;
Merge into scores A USING
(Select
r_num.id_number as ID, score1 as scorea, score2 as scoreb, score3 as scorec, TO_DATE(sysdate, 'DD/MM/YYYY') as scoredate
FROM DUAL) B
ON ( A.ID = B.ID and A.scoredate = B.scoredate)
WHEN NOT MATCHED THEN
INSERT (
ID, scorea, scoreb, scorec, scoredate)
VALUES (
B.ID, B.scorea, B.scoreb, B.scorec,B.scoredate)
WHEN MATCHED THEN
UPDATE SET
A.scorea = B.scorea,
A.scoreb = B.scoreb,
A.scorec = B.scorec;
COMMIT;
END LOOP;
END;
, тогда как функция A / B / C имеет сложные запросы, присоединяется к ней для вычисления оценки.
Пожалуйста, предложите мне любые способ улучшить производительность, потому что в настоящее время с помощью этого фрагмента кода я могу вставить только 2k записей в течение 1 часа? Могу ли я использовать параллельный DML здесь? Спасибо!