JDBC准备的语句没有大的列,这会导致性能瓶颈。 ETL工具如何规避此问题?

时间:2018-06-25 09:11:04

标签: oracle jdbc

主要是数据库专家,并且不使用Java进行批量加载等,因为这些操作是由ETL工具或数据库内部工具完成的。

但是,如果我理解正确,工具是由Java / C ++等编写的,它们使用JDBC,ODBC来实现操作。

最近在一个项目中尝试使用JDBC加载批量数据并观察到以下内容。

我们有100万条记录,1.5 Gb数据,表有360列。 从表A读取并尝试在5k的目标表中插入,记录了批处理模式间隔。源abd目标是Oracle。

该项目使用Spring JDBC。我在这里使用了简单的JDBC来单独测试并调试性能问题。  用伪语言描述的逻辑。

prepare statement for Target with 
"insert into target values ( ?,?, .. 368 columns);
rs = (  select * from table a );
while rs.next {
  stmt.setstring(1, rs.getString("column1");
 .
 .
 360 columns.
 stmt.add_batch();

 if 5K records then executeBatch();
}

主要问题:

每5K记录所设置的语句大约需要1分钟以上的时间。

因此,仅加载1.5 Gb或100万个rec将花费大约。 4小时。

我正在单线程中执行此操作,但我感觉音量很低。 有没有更好的方法来实现这一目标?

ETL工具说informatica等如何在内部实现?

另一个问题是:有时executeBatch()对于某些具有相似列数且每条记录有更多卷的表,一次写入5k条记录。在某些情况下,尽管executeBatch在5k行之后一次性写入了100条记录,并且写入也需要100万条记录的永恒性。

如果我将set语句用作

,则还有另一件事而不是结果集
for (I=1 ,I<=1000000; I++)
  stmt.setstring(1, rs.getString("123456789");--hardcode value
    .
    .
    360 columns.
   stmt.add_batch();
  if 5K records then executeBatch();
}

然后,每5k和2-3秒绑定到executeBatch()大约需要4秒。因此,在20分钟内,我能够加载6到7 GB的数据中的100万。

0 个答案:

没有答案