Sql Oracle:使用批处理过程而不是批插入时,性能大幅降低

Sql Oracle:使用批处理过程而不是批插入时,性能大幅降低,sql,spring,oracle,jdbc,oracle11g,Sql,Spring,Oracle,Jdbc,Oracle11g,我将使用批处理中的存储过程将数据批量插入到Oracle 11g数据库中。在我的上传测试中,我感觉到处理数据所花费的时间相当长。 因此,我绕过了存储过程,使用存储过程使用的insert语句大容量插入了相同的数据。结果是:这要快得多 我知道最简单的解决方案是去掉存储过程,但这正是数据库人员希望我使用的。因此,我想确定我的编码方式不是导致性能下降的原因 这是我用来调用存储过程的代码: try { jdbcTemplate.batchUpdate( "call foo(?,?,?,?,?)",

我将使用批处理中的存储过程将数据批量插入到Oracle 11g数据库中。在我的上传测试中,我感觉到处理数据所花费的时间相当长。 因此,我绕过了存储过程,使用存储过程使用的insert语句大容量插入了相同的数据。结果是:这要快得多

我知道最简单的解决方案是去掉存储过程,但这正是数据库人员希望我使用的。因此,我想确定我的编码方式不是导致性能下降的原因

这是我用来调用存储过程的代码:

try {
  jdbcTemplate.batchUpdate( "call foo(?,?,?,?,?)",
   new BatchPreparedStatementSetter() {
  @Override
  public void setValues(PreparedStatement ps, int i) throws SQLException {
      LookupEntry le = cachedEntries.get(i);
     ps.setTimestamp(1, new Timestamp( le....
     ps.setString(2, le....
     ps.setString(3, le....
     ps.setString(4, le....
     ps.setString(5, le...
    }

    @Override
  public int getBatchSize() {
   int size = cachedEntries.size();
   return size;
  }
    });
  } catch (DuplicateKeyException e) {
   log.error( "bummer ..., e);
  }
存储过程的定义如下:

CREATE OR REPLACE PROCEDURE "X"."FOO"
(SomeDate in Timestamp, String1 in VARCHAR2, String2 in VARCHAR2, String3 in VARCHAR2, String4 in VARCHAR2)
AS
    begin
    INSERT
INTO
    X.BAR
    (
        SOMEDATE,
        STRING1,
        STRING2,
        STRING3,
        STRING4
    )
    VALUES
        (SomeDate,String1,String2,String3,String4);
end;             
当我用7500个条目进行测试时,上传需要70秒

但是,当我将insert语句直接复制到代码中(其余部分保持不变)时,相同的数据将在4秒钟内存储


你认为这有什么原因吗?我的代码是否效率低下?或者,调用存储过程会使Oracle变得如此缓慢,有什么好的原因吗

我将坚持直接插入批处理,不再使用该过程。也许我会尝试插入一个视图,因为这会以与过程类似的方式将我的程序与数据库结构分离。

调用过程总是会产生一些开销。你在何时何地提交?这是一个很好的问题,它告诉我我忘了处理一些事情。显然,Spring确实发出了自动提交,因为我没有显式提交,但数据仍然存在。出于好奇,您是否有理由需要在过程中而不是直接插入?您是否每次都需要将数据插入不同的表中(同义词不起作用)?存储过程的批处理执行完全可能没有正常DML可用的优化(如实际批处理);但我有一段时间没有和甲骨文合作过,所以我不确定这一点。视图可以随时更新,但只要它表示为表的一对一映射,Oracle就非常乐意插入/更新/删除它。