我如何批量插入?

时间:2013-07-03 08:56:58

标签: java performance jdbc prepared-statement teradata

我想用jdbc将数据插入TERADATA。但它很慢。我怎样才能让它更快?

我写了这段代码:

connection_tera= DriverManager.getConnection
             (
             "jdbc:teradata://192.168.x.xx/database=DBC,tmode=ANSI,charset=UTF8","dbc","dbc"
             ); 

stmt_tera = connection_tera.prepareStatement("insert into a.b values(?)");
//some code here to start while loop 
  stmt_tera.setObject(i,reset.getobject(i));
  stmt_tera.addBatch();  
 if(addedBatchNumber%100==0)
  stmt_tera.executeBatch(); 
  connection_tera.commit(); 
  stmt_tera.clearBatch();
//some code here and finish while loop

我应该将类似TYPE = FASTLOAD的参数添加到连接字符串吗?或其他什么?

3 个答案:

答案 0 :(得分:2)

如果要加载到表,我会考虑使用JDBC FastLoad。有关将数据插入Teradata表的JDBC性能的更多详细信息,请参阅Teradata Developer Exchange上的以下文章:Speed up your JDBC/ODBC Applications

如果您的表不为空,则可以将数据加载到先前为空的登台(中间)表中。然后使用ANSI MERGE操作将INSERT/UPDATE逻辑应用于目标表。 MERGE操作的执行速度比传统的INSERTUPDATE更快,因为操作在块级而不是行级工作。在某些情况下,您甚至可以在将数据应用于目标表之前避免假脱机源数据。

以下是Teradata JDBC驱动程序示例的collection。程序205到209是使用FastLoad的示例。

答案 1 :(得分:2)

此外,您还可以考虑硬币的另一面。意思是您可以考虑使用单个查询执行多行插入

insert into table1 (First,Last) values ('Fred','Smith'),
  ('John','Smith'),
  ('Michael','Smith'),
  ('Robert','Smith');

好处是

  • 与数据库连接/交互是一项昂贵的操作。假设您必须使用您的代码插入100行,这样您就可以编写应用程序以激发100个quires(100 db交互)。而不是这样,如上所述构建您的sql查询并尝试插入并检查性能。
  • 您正在避免n次数据库交互。
  • 如果你这样做,插入操作会更快地加速。这是一种广泛采用的恢复/导入数据库的技术。

希望这会有所帮助.. 干杯!

干杯!

答案 2 :(得分:1)

如果我正确地读了这个,你正在执行并提交一个只有一个插入语句的批处理 - 我不认为这是你的意图(或者,如果它是,我认为你误解了批处理预计将被使用)

好像你需要有一个内部循环,可以向批处理中添加任意数量的语句,然后通过executeBatch()提交