2013-07-03 156 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個數據庫交互。
  • 如果你這樣做,插入操作可以更快地完成。這已經被廣泛採用來恢復/導入數據庫。

希望這會有幫助.. 乾杯!

乾杯!