2013-04-20 91 views
0

我剛剛發現JDBC的addBatch操作,如果給 「INSERT INTO MYTABLE(ID,姓名)VALUES(?,?)」 將創造這樣的事情:在JDBC中批量插入 - 單個事務會變慢多少?

BEGIN TRANSACTION 
INSERT INTO mytable (id, name) VALUES (1, "a"); 
INSERT INTO mytable (id, name) VALUES (2, "b"); 
... 
END TRANSACTION 

相比,這樣的語句:"INSERT INTO mytable (id, name) VALUES (1, "a"), (2, "b"), .. " ,大規模交易的速度會慢多少? I/O問題的差異會顯着嗎?

+0

我認爲批處理是關於消除網絡往返和延遲。顯然,發送一批N次操作比每次執行N次操作會產生很大的差異。 – duffymo 2013-04-20 02:27:20

回答

0

批處理通常會更快,否則。

以下幾種情況,給你一個想法,假設這是相同的連接:

  1. 自動提交開啓。數據庫寫入TX日誌。批次更快。
  2. 自動提交已打開。數據庫不寫入TX日誌。同樣的速度,網絡問題可能會導致批量更快。
  3. 自動提交已關閉。數據庫寫入TX日誌。同(2)
  4. 自動提交關閉。數據庫不寫日誌。同(2)。

由於通常在TX中執行查詢並記錄並且網絡是瓶頸,批處理通常更快。出於同樣的原因,ORM框架提供了以批處理模式執行查詢的工具。

1

PgJDBC配料一般不如多值INSERT快,但它的更方便。

到目前爲止,最有效的選擇是通過PgJDBC's support for COPY使用COPY命令。

第二個選項是打開一個事務,對每個插入(比如說)10行進行批量的多值插入,接着是一組單行插入來彌補差異,然後進行提交。

PgJDBC批處理不應該比打開一個事務,準備一個語句,循環遍歷數據發送每行與準備好的語句,然後做一個明確的提交顯着更快。我不想認爲它目前在一次批量中同時有多個報表正在運行,但我不確定,如果這樣做會在網絡延遲是一個因素時使批量顯着加快。

我建議測試一下並獲得實際的影響。