Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql 当有许多记录时,如何减少插入数据库的时间?_Plsql - Fatal编程技术网

Plsql 当有许多记录时,如何减少插入数据库的时间?

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

这是我的代码,数千条记录插入到表中,但执行时间很长(大约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) 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)