如何在 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 中生成和插入大型数据集?的主要内容,如果未能解决你的问题,请参考以下文章