Plsql 当有许多记录时,如何减少插入数据库的时间?
这是我的代码,数千条记录插入到表中,但执行时间很长(大约15分钟),如何减少这一时间? 多谢各位Plsql 当有许多记录时,如何减少插入数据库的时间?,plsql,Plsql,这是我的代码,数千条记录插入到表中,但执行时间很长(大约15分钟),如何减少这一时间? 多谢各位 BEGIN delete from pre_percapita_accords t where t.dat_capit = DATACTUL; FOR REC2 IN FORMUL_ID LOOP FOR rec1 in FND_Bunit loop FOR REClkp1 IN EMPLY(rec1.cod_busun,rec1.lkp_cod_dput_busun
BEGIN
delete from pre_percapita_accords t where t.dat_capit = DATACTUL;
FOR REC2 IN FORMUL_ID LOOP
FOR rec1 in FND_Bunit loop
FOR REClkp1 IN EMPLY(rec1.cod_busun,rec1.lkp_cod_dput_busun) LOOP
v_result_param1 := Fnd_Formula_Pkg.SET_PARAM_VALUE_FUN(REC2.FRML_ID,
'EMPL_ID',
to_char(REClkp1.num_prsn_emply));
v_result_param2 := Fnd_Formula_Pkg.SET_PARAM_VALUE_FUN(REC2.FRML_ID,
'DAT_ACCORD',
to_char(DATACTUL));
fnd_formula_set_param_prc(REC2.FRML_ID);
resultFun := Fnd_Formula_Pkg.GET_PARAM_VALUE_FUN(REC2.FRML_ID,
'NUM_RESULT');
resultFun := trunc(resultFun, 3);
if REClkp1.NUM_PRSN_EMPLY is not null and resultFun is not null and
DATACTUL is not null then
INSERT INTO pre_percapita_accords
(FRMLS_FORMUL_STEP_ID,
dat_capit,
num_capit,
emply_num_prsn_emply,
lkp_status_capit)
VALUES
(rec2.formul_step_id,
DATACTUL,
resultFun,
REClkp1.NUM_PRSN_EMPLY,
'3');
end if;
END LOOP;
END LOOP;
end loop;
您有3个嵌套的游标循环,在其中调用最低级别的多个函数并执行单行插入。这里有许多改进的可能性: 1) 函数Fnd_Formula_Pkg.SET_PARAM_VALUE_FUN调用了两次,但结果从未使用过(在您展示的代码中)-这些调用可以简单地删除吗 2) 对Fnd_Formula_Pkg.SET_PARAM_VALUE_FUN的第二次调用不使用EMPLY或Fnd_Bunit游标中的任何数据,因此可以将其移到这两个循环之外,从而减少对它的调用 3) 您可以将结果保存到数组中,然后使用批量插入,例如一次插入1000行
4) 理想情况下,整个过程可以在不使用游标的情况下作为单个INSERT…SELECT语句重新编写。不过,我不能肯定这在这里是可能的。与其猜测,不如尝试一些更好的指标来衡量正在发生的事情。我猜函数调用很慢
如果这看起来太令人生畏,您还可以通过添加一些计时日志语句(使用时间戳)进行调试,当然可以针对dev db进行测试,并查看时间花在哪里(有点像旧的printf语句调试)。至少你会更好地了解什么占用了你大部分的时间。尝试使用集合并插入所有:
注释掉插入查询部分。然后运行并比较执行时间。我怀疑的是,插入不会占用太多时间。大部分时间被调用的函数占用。如果在注释插入部分后,时间没有得到改善,实际上您需要优化其他函数(Fnd_Formula_Pkg.SET_PARAM_VALUE_FUN)