【发布时间】:2012-08-17 13:49:11
【问题描述】:
我有以下 PL/SQL 块,它创建了一个插入新猫的过程:
CREATE OR REPLACE PROCEDURE INSERT_NEW_CAT(AGE NUMBER, WEIGHT NUMBER, NAME VARCHAR2)
AS
BEGIN
INSERT INTO CATS(cat_id,age,weight,name)
VALUES(cat_id_sequence.nextval,age,weight,name);
END INSERT_NEW_CAT;
下面的 Java 块可以批量插入这些猫:
CallableStatement statement = conn.prepareCall("{CALL insert_new_cat(?,?,?)}");
for(int i = 0; i < 50000;i++)
{
statement.setInt(1, i);
statement.setInt(2,i);
statement.setString(3,"Test");
statement.addBatch();
if(i % 16382== 0) //max value my batch can support on my hardware
{
statement.executeBatch();
}
}
statement.executeBatch();
所以问题是我每秒只能保存 700 条记录,这非常慢。我认为问题在于我每行调用一次上述 PL/SQL 函数(或每批条目一次)。如何重新编写上述函数以获取这些语句的数组并进行批量插入以将函数调用次数减少到 N 模 16382 + 1?数据库是Oracle 10g。
【问题讨论】:
-
只是一个问题。如果您每 100 条左右的记录执行一次批处理,而不是在 16000 条奇数记录之后执行,您是否认为它可能会更高效?
-
@sethu 我相信对数据库的调用越多,性能就会下降得越多,所以不会。同样作为仅供参考的表演者不是一个词:)
-
性能肯定是一个词。而且,我更多地来自记忆的角度。内存将被保留,直到您执行批处理。这可能会减慢您的系统速度。您可能需要进行试验并获得正确的批量大小。
-
@sethu 它绝对不是一个词,不管确定。
-
与问题无关,但是... english.stackexchange.com/questions/38945/…
标签: java sql oracle function plsql