【问题标题】:Oracle: drastically reduced performance when using batched procedure instead of batch insertsOracle:使用批处理过程而不是批处理插入时大大降低了性能
【发布时间】:2015-03-05 21:03:46
【问题描述】:

我将使用存储过程批量将数据批量插入到 Oracle 11g 数据库中。在上传测试期间,我感觉到处理数据所花费的时间相当长。 所以我绕过了存储过程,并使用存储过程使用的插入语句批量插入了相同的数据。结果:速度更快。

我知道最简单的解决方案是摆脱存储过程,但这是数据库人员希望我使用的。所以我想确定我的编码方式不是造成这种性能损失的原因。

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

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 秒。

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

您认为这是有原因的吗?我的代码效率低下吗?或者是否有充分的理由调用存储过程使 Oracle 如此缓慢?

【问题讨论】:

  • 调用过程总是会产生一些的开销。你何时何地COMMIT-ing?
  • 这是一个非常好的问题,它表明我忘了照顾一些事情。显然 Spring 确实发出了自动提交,因为我没有明确提交,但数据仍然存在。
  • 出于好奇,您是否有理由需要在程序中而不是直接插入?您是否需要每次都将数据插入不同的表(同义词不起作用)?
  • 存储过程的批处理执行完全有可能没有普通 DML 可用的优化(例如真正的批处理);但我已经有一段时间没有与 Oracle 合作了,所以对此我不确定。
  • @Marged - 也许你应该考虑inserting into a view 而不是过程。视图可以随时更新,但只要它表示为表的一对一映射,Oracle 非常乐意插入/更新/删除它。

标签: sql spring oracle jdbc oracle11g


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2012-02-06
    • 2019-11-01
    相关资源
    最近更新 更多