如何在 db2 中生成和插入大型数据集?

Posted

技术标签:

【中文标题】如何在 db2 中生成和插入大型数据集?【英文标题】:How to generate and insert large dataset in db2? 【发布时间】:2013-05-27 05:39:56 【问题描述】:

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

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++; 
     

【问题讨论】:

您在哪种类型的平台上使用 DB2? DB2 z/OS、DB2 LUW 还是 DB2 for i? 我使用 DB2 LUW (Windows)。 考虑使用批量更新:pic.dhe.ibm.com/infocenter/db2luw/v9r7/topic/… 你分析过代码吗?哪里来的慢? 请看之前的留言。 【参考方案1】:

由于您使用的是 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(); 
    

【讨论】:

以上是关于如何在 db2 中生成和插入大型数据集?的主要内容,如果未能解决你的问题,请参考以下文章

带有大型数据集的 SQL 插入

如何在大型数据集上执行克里金(高斯过程回归)?

大型记录集 (VBA) 的 MS Access 插入慢

Pentaho 数据集成 从数据库导入大型数据集

如何在 pytorch 中处理大型数据集

如何在 R 中读取大型数据集 [重复]