2017-07-16 76 views
0

我正在使用Sybase ASE 15.5和JDBC驅動程序jconnect 4,並且遇到緩慢的insert with executebatch(),批量大小爲+/- 40行包含列(整數,varchar(128),varchar(255)),列(1,2)上的主鍵和聚簇索引以及列(2,1)上的非聚簇索引。每批+/- 40行需要+/- 200毫秒。慢度是否與桌子的大小有關?我知道刪除索引可以提高性能,但不幸的是這不是一個選項。我該如何提高插入速度?Sybase ASE 15.5:使用JDBC緩慢插入executebatch()

注意:這是應用程序實時運行的一部分,這不是一次性遷移,所以我不會使用bcp工具。

編輯:我已經檢查這個答案MySQL,但不知道它適用於Sybase ASE的https://stackoverflow.com/a/13504946/8315843

+0

我不知道你所說的'+/- 40 rows'和'+/- 200ms'(我通常會拿這些意味着一個80行範圍,以及400ms的範圍......是什麼意思? );或者你說需要200毫秒才能插入40行? – markp

+0

40行200ms,如果我沒有弄錯的話。我會再次檢查。 – Sybuser

+0

它需要240ms,但不會插入任何東西。我已經打開了一個新問題https://stackoverflow.com/q/45150506/8315843 – Sybuser

回答

2

有很多原因的插入可能比較緩慢,如:

  • 每個插入語句有被分析/編譯; ASE 15。x優化器嘗試執行lot比以前的ASE 11/12優化器更多的工作,其結果是編譯(通常)需要更長的時間來執行
  • 批次未包裝在單個事務中,因此每個插入都有等待一個單獨的寫日誌,完成
  • 你已經得到了客戶端主機和數據服務器主機之間的網絡連接很慢
  • 有一些阻塞回事
  • 該表需要是FK約束檢查每個插入
  • 有餐桌上的INSERT觸發器(W /很明顯的問題Ø ˚F是什麼觸發做多久沒有考慮到執行其操作)

一些想法考慮重新:加快插入:

  • 使用預處理語句;第一個插入被編譯成一個輕量級過程(想'temp procedure');後續插入物(使用製備的語句)受益於不必被編譯
  • 確保批量插入物被包裝在一個包裝begin/commit tran;這往往推遲日誌寫入(s)直到commit tran發佈;少寫入日誌意味着更少的時間等待日誌寫入待確認
  • 如果你有一個(相對)較慢的網絡應用和數據服務器主機之間的連接,看看使用較大的數據包大小;更少的包意味着更少的時間等待往返包處理/等待
  • 直視如果/ JDBC如何支持批量複製庫(基本實現通過JDBC BCP類似的行爲)使用JDBC所以我我不工作米只是猜測,這可能是avaialble]

上述一些被覆蓋在這些SO線程:

Getting ExecuteBatch to execute faster

JDBC Delete & Insert using batch

Efficient way to do batch INSERTS with JDBC

+0

每批+/- 40行是事務的一部分,所以它的+/- 40 addBatch()+ 1提交 – Sybuser

+0

已經在使用準備的語句。沒有外鍵,沒有觸發器,沒有阻塞查詢。 – Sybuser

+0

您是否在連接中使用了'ENABLE_BULK_LOAD'選項?看看這個[示例](https://stackoverflow.com/questions/2112395/sybase-jconnect-enable-bulk-load-usage) –