Oracle:使用批处理过程而不是批插入时性能大幅降低
Oracle: drastically reduced performance when using batched procedure instead of batch inserts
我要使用存储过程批量将数据批量插入到 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 如此缓慢是否有充分的理由?
我会坚持直接插入批处理,不再使用程序。也许我会尝试插入到视图中,因为这会以与过程类似的方式将我的程序与数据库结构分离。
我要使用存储过程批量将数据批量插入到 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 如此缓慢是否有充分的理由?
我会坚持直接插入批处理,不再使用程序。也许我会尝试插入到视图中,因为这会以与过程类似的方式将我的程序与数据库结构分离。