java - Oracle和JDBC计算事务期间发生的执行次数及其性能

标签 java sql performance oracle jdbc

我有以下代码:

void updateRecords(long[] ids, Timestamp[] dates, Connection connection
{
   PreparedStatement statement = connection.prepareStatement(
                             "Update Foo set date = ? where id = ?");
   for(int i =0; i < ids.length;i++)
   {
        statement.setTimestamp(1,dates[i]);
        statement.setLong(2,ids[i]);  
        statement.addBatch();  
        if(i %25000 == 0)
        {
            statement.executeBatch();
            statement.clearBatch();  
        }
   }
   statement.executeBatch();
}

这个性能很糟糕,100 万次更新需要 2 个小时以上。所以在我的多部分问题中:

1) Oracle 上执行了多少条语句?
2) 如何提高 Oracle 上执行的语句数量,以减少执行 100 万次更新所需的时间?

这是 Oracle 10g 和 Java 6。

我想这会执行 N 个语句,其中 N 是 ids

最佳答案

1) 是的,有多少个 id,oracle 就会执行多少条语句。

2)对于这样的事情,最好的选择是在一次调用中将日期发送到数据库,然后使用存储过程进行更新。例如,您可以将 ids 和时间戳作为数组发送,然后在存储过程中重新创建逻辑。此外,根据您的数据库结构和配置,在存储过程中经常运行提交可以提高性能(假设您的操作不必是原子的)。

你可以看一个例子here 。只需更改类型以满足您的要求,而不是执行插入,而是在存储过程中执行更新:

forall i in 1.. example.count 
  update Foo set date =  treat(example(i) as T_TYPE).DATE where id = treat(example(i) as T_TYPE).ID;
end; 

关于java - Oracle和JDBC计算事务期间发生的执行次数及其性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628148/

相关文章:

java - 使用 JavaParser 使用 getExtendedType 查找继承

java - 更快的算法来找到斐波那契 n mod m

java - Java Maven 项目的 Marginalia/Docco/etc?

sql - 用于删除括号的 PostgreSQL regexp_replace()(示例)

sql - 如何添加字符

java - 解析一行数据: split vs regex

ios - 通过 NSDate 从 NSDictionary 加载 UITableView 部分?

java - 如何使用 jasper/jrxml 创建如图所示的 pdf 目录?

sql - 访问数据库元数据

algorithm - 该算法的大 O 表示法是什么