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

时间:2015-01-07 20:52:16

标签: sql spring oracle jdbc oracle11g

我将使用批处理中的存储过程将数据批量插入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变得如此之慢?

1 个答案:

答案 0 :(得分:1)

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