Java 删除后的JDBC插入会降低性能
我按顺序运行JDBC查询,Java 删除后的JDBC插入会降低性能,java,oracle,jdbc,Java,Oracle,Jdbc,我按顺序运行JDBC查询,INSERT、DELETE、INSERT、DELETE等。我在1000个批次中插入一百万条记录,然后在单个查询中删除这一百万条记录,然后再次插入。在这种情况下,我只对插入性能感兴趣 当我在循环中运行,即10次迭代时,在第一次迭代时,性能最快,即11秒,然后在每次下一次迭代后,insert的性能比上一次慢几秒。但是,当我不在循环中运行它时,插入时间非常相似 知道为什么吗 for(number of iterations){ //process insert o
INSERT
、DELETE
、INSERT
、DELETE
等。我在1000个批次中插入一百万条记录,然后在单个查询中删除这一百万条记录,然后再次插入。在这种情况下,我只对插入性能感兴趣
当我在循环中运行,即10次迭代时,在第一次迭代时,性能最快,即11秒,然后在每次下一次迭代后,insert的性能比上一次慢几秒。但是,当我不在循环中运行它时,插入时间非常相似
知道为什么吗
for(number of iterations){
//process insert of million records here, batch size is 1000
//prepared statement is used and clearBatch is called after every 1000
//inserts,
//at the end prepared statement is closed and connection.commit() is
//called
//Thread.sleep(1000) called here
//everything is inserted now in the DB so delete what has been inserted
//in single query. connection.commit() called again after delete.
//Thread.sleep(1000) and repeat the same actions until loop finishes.
}
对不起,我身上没有密码
你知道为什么在下一次迭代中插入会变慢吗?如果没有代码,我不能确定,但是我认为你有内存泄漏,因此额外的时间是由于垃圾收集造成的。这就解释了为什么在没有循环的情况下多次运行同一代码会更快。在启用GC日志记录(-XX:+PrintGC)的情况下运行程序,看看会发生什么
为了消除数据库问题,您可能需要使用另一个(新)表进行测试,并用truncate表替换delete,以防万一。是否在一个事务中运行它?否,我使用一个PreparedStatement对象将其插入1000 x 1000。随着批量大小的不同,每次迭代的时间也会增加。单笔交易也有一百万。是远程数据库还是本地数据库?表上有索引吗?你能试着用TRUNCATE替换DELETE吗?它是远程数据库,不确定索引。我将尝试TRUNCATE并查看它是否有任何更改。不幸的是,无法使用TRUNCATE对其进行测试,因为数据库中已有其他数据,我无法删除。