2013-07-03 78 views
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 

我应该添加paramater像TYPE = FASTLOAD到连接字符串?或者是其他东西?

+0

批量操作通常是在数据库系统上配置的,但也许在目标表上禁用索引将有所帮助 – 2013-07-03 09:17:48

回答

2

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

如果您的表不是空的,则可以将数据加载到分段(中间)表首先是空的。然后使用ANSI MERGE操作将INSERT/UPDATE逻辑应用于目标表。 MERGE操作将比传统的INSERTUPDATE语句执行得更快,因为该操作在块级而不是行级上运行。在某些情况下,您甚至可以避免在将数据应用到目标表之前后台处理源数据。

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

+0

感谢您的回复,我正在加载到空表。我在该网站使用'Batch Ready',但它仍然很慢。但我无法尝试在该网站上的“全速前进” –

+0

您通过此界面加载了多少数据?我在我的回答中添加了一个示例程序集的链接。 –

+0

我尝试将415.000行加载到TERADA.It需要20多分钟 –

1

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

好像你需要有一个内部循环,增加语句批任意数量的您,然后通过executeBatch()

+0

我试过了,但仍然很慢 –

+0

然后我认为我们正在朝着Rob建议的方向前进。看起来你每秒钟做大约350次插入,这对我来说非常适合java/jdbc程序,特别是如果数据库和应用程序位于不同的服务器上(我认为你不指定)。 Java不是每个工作的完美工具。顺便说一下,在你的代码中,你永远不会增加addedBatchNumber - 我假设只是没有显示,否则你仍然提交由1条语句组成的批处理。另一个选择是运行多个线程(这里假设瓶颈在java中) – DaveH

+0

如何在jdbc上执行fastload? –

2

此外,还可以考虑coin..Meaning的另一侧,你能想到用单一的查询进行多行INSERT的

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

的好处是

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

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

干杯!