1

我想用 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 之类的参数添加到连接字符串吗?或者是其他东西?

4

3 回答 3

3

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

如果您的表不为空,则将数据加载到首先为空的暂存(中间)表可能是有意义的。然后使用 ANSIMERGE操作将INSERT/UPDATE逻辑应用于目标表。该MERGE操作将比传统的INSERTandUPDATE语句执行得更快,因为该操作在块级别而不是行级别进行。在某些情况下,您甚至可以避免在将数据应用于目标表之前对源数据进行假脱机。

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

于 2013-07-03T13:50:31.717 回答
2

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

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

好处是

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

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

干杯!

于 2013-11-19T19:12:46.603 回答
1

如果我没看错,那么您正在执行并提交一个只有一个插入语句的批处理 - 我认为这不是您的意图(或者,如果是,我认为您误解了批处理的预期方式使用 )

似乎您需要一个内部循环,将任意数量的语句添加到您然后通过提交的批处理中executeBatch()

于 2013-07-03T09:14:07.393 回答