【问题标题】:How can I bulk insert?如何批量插入?
【发布时间】:2013-06-30 21:23:10
【问题描述】:

我想用 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 之类的参数添加到连接字符串吗?还是别的什么?

【问题讨论】:

  • 批量操作通常在数据库系统中配置,但禁用目标表的索引可能会有所帮助

标签: java performance jdbc prepared-statement teradata


【解决方案1】:

如果您要加载到 表,我会考虑使用 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 的示例。

【讨论】:

  • 感谢回复,我正在加载到空表。我在该站点中使用Batch Ready,但它仍然很慢。但我不能在那个网站上尝试Full Speed Ahead
  • 你通过这个界面加载了多少数据?我已在我的答案中添加了指向示例程序集合的链接。
  • 我尝试将 415.000 行加载到 TERADA。这需要 20 多分钟
  • 我编辑我的问题。当添加的批次号为 100 时,我执行批次。但它仍然很慢。我无法理解。我认为连接字符串中需要一些参数
  • 如果您通过 JDBC 加载 415K 记录,则最好使用 JDBC FastLoad。
【解决方案2】:

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

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

好处是

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

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

干杯!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 那么我认为我们正朝着 Rob 建议的方向前进。看起来您每秒执行大约 350 次插入,这让我觉得对于 java / jdbc 程序来说非常好,特别是如果数据库和应用程序位于不同的服务器上(我认为您没有指定)。 Java 并不是所有工作的完美工具。顺便说一句,在您的代码中,您永远不会增加 addedBatchNumber - 我假设这只是没有显示,否则您仍然提交包含 1 个语句的批次。另一种选择是运行多个线程(假设瓶颈在 java 中)
    • 如何在 jdbc 上进行快速加载?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2012-07-09
    • 2014-04-13
    相关资源
    最近更新 更多