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

Oracle JDBC准备的语句没有大的列,导致性能瓶颈。ETL工具如何规避这个问题?,oracle,jdbc,Oracle,Jdbc,主要是一个DB guy,没有使用java进行批量加载等,因为这些都是由ETL工具或DB内部工具完成的 但如果我理解正确的话,这些工具是由Java/C++等编写的,它们使用JDBC、ODBC来实现操作 最近,在一个试图使用JDBC加载批量数据的项目中,观察到以下情况 我们有一百万条记录,1.5GB的数据,这个表有360列。 从表A中读取并尝试以5k记录批处理模式间隔插入目标表。源abd目标是Oracle 该项目使用SpringJDBC。我在这里使用了简单的JDBC来单独测试和调试性能问题。 用伪语

主要是一个DB guy,没有使用java进行批量加载等,因为这些都是由ETL工具或DB内部工具完成的

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

最近,在一个试图使用JDBC加载批量数据的项目中,观察到以下情况

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

该项目使用SpringJDBC。我在这里使用了简单的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记录,set语句大约需要1分钟以上的时间

因此,仅加载1.5 Gb或100万rec大约需要4小时

我是在一个线程中完成的,但我觉得音量很低。 有没有更好的方法来实现这一点

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

另一个问题是:有时
executeBatch()
对于某些列数相似且每条记录的卷数更多的表,一次写入5k条记录。在某些情况下,它一次写入100条记录,尽管
executeBatch
在5k行之后,但写入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();
}

for(I=1,我告诉过你事实上是
setString()
花费了时间,而不是通过
rs.next()
rs.getString()处理结果集
?是的,在min中查询完成。此外,当我在PL/SQL中使用游标for循环执行此操作时,每4k记录在150秒内插入100万条记录并提交一次。用Java理解这需要时间,但目前需要4-5个小时。我很困惑。源数据库客户端Java远程数据库之间的延迟是什么?延迟是多少可以忽略不计。此外,为了测试它,我正在使用Java客户端和目标数据库来模拟源、Java和目标。我正在从目标6 GB分区表读取数据,并在目标本身中将数据写回一个新的空表。你确定这是“大量列”吗?例如,如果列数较少,或者没有插入
时,性能如何?逐行处理不可避免地会有开销。在PL/SQL中,这一直被认为是一种不好的做法,也就是说,没有从数据库中取出数据并再次将其推回的额外开销。