1

我更改了代码,此代码插入 30 000 row/min ,但它太慢了。我的任何人都给我另一个想法如何提高速度?

Connection connection = poolledConnection.getConnection(); 
connection.setAutoCommit(false); 
int bathcount = 0; 
Statement st = connection.createStatement(); 
    for (condit){ 
        st.addBatch(sql); 
            if (bathcount >= 10000){ 
                st.executeBatch(); 
                connection.commit(); 
                st.clearBatch();
                bathcount = 0; 
            }
        bathcount++; 
    } 
}
4

1 回答 1

0

由于您使用的是 Statement 而不是 PreparedStatement,因此 DB2 很可能正在为您的每个插入语句进行准备。进行一次准备,而不是数千次或数百万次,将为您节省大量的 CPU 时间。

为了提高速度,您应该有一个带有参数标记的 SQL 语句,并为每一行设置这些参数。

我假设在您的示例中,您必须以某种方式为每一行构建 SQL。如果我错了,并且您为每一行使用相同的插入值,您可以跳过设置参数值,它会更快。

因此,对于我建议的更改,它看起来像这样(我假设这是 Java):

String sql = "INSERT INTO TBL (COLS...) VALUES (?,?...)";

Connection connection = poolledConnection.getConnection(); 
connection.setAutoCommit(false); 
int bathcount = 0; 
PreparedStatement ps = connection.prepareStatement(sql); 
    for (MyObject object : objectList /*conduit???*/){
        ps.setString(1,object.getVal1());
        ps.setString(2,object.getVal2()); 
        ps.addBatch(); 
            if (bathcount >= 10000){ 
                ps.executeBatch(); 
                connection.commit(); 
                bathcount = 0; 
            }
        bathcount++; 
    } 
    /* Make sure you add this to get the last batch if it's not exactly 10k*/
    if (batchcount > 0) {
       ps.executeBatch(); 
       connection.commit(); 
    }
}
于 2014-04-15T01:58:33.580 回答