在oracle pl / sql中每周有120k条记录有没有更快的合并方法?

问题描述 投票:0回答:2

[数据库中大约有12万条记录,根据一些功能,我计算了所有记录的分数,每周我必须用新记录和相应的分数更新表。

下面是我用来将数据合并到表中的过程:

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;

而functionA / B / C具有复杂的查询,请加入其中以计算分数。

请向我建议任何提高性能的方法,因为当前使用此代码段,我只能在1小时内插入大约2k条记录?我可以在这里使用并行DML吗?谢谢!

oracle function stored-procedures plsql procedure
2个回答
0
投票

我已经从select语句中插入了一些成功的东西。它表现出色,因为它不涉及逐行插入。

就您而言,我想这应该是这样的:

INSERT INTO table (ID, scorea, scoreb, scorec, scoredate)
SELECT functionA(id_number), functionB(id_number), functionC(id_number)
FROM tableA

此示例可在下面的链接中找到:https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems025.htm


0
投票

您为什么要在程序中这样做?这都可以通过DML完成:

MERGE INTO scores a USING
  (SELECT ta.id_number AS ID, 
          functionA(ta.id) AS scoreA,
          functionB(ta.id) AS scoreB,
          functionC(ta.id) AS scoreC,
          TO_DATE(sysdate, 'DD/MM/YYYY') as scoredate
   FROM tableA ta) b
ON (a.id = b.id AND a.scoredate = b.scoredate)
WHEN MATCHED THEN UPDATE SET
  a.scorea = b.scorea,
  a.scoreb = b.scoreb,
  a.scorec = b.scorec
WHEN NOT MATCHED THEN INSERT (ID, scorea, scoreb, scorec, scoredate)
VALUES (B.ID, B.scorea, B.scoreb, B.scorec,B.scoredate);

如果您想在此之后尝试使用PARALLEL提示,请放心。但是,您绝对应该摆脱该光标,并停止执行“逐个慢速”处理。

© www.soinside.com 2019 - 2024. All rights reserved.