2013-11-09 20 views
0

我有一個腳本,執行以下操作..長數據庫操作的最佳方法?

  • 從數據庫
  • 調用外部API(從互聯網上一些otherserver)取一個記錄和讀取數據
  • 它讀取數據更新SQL數據庫(使用更新的值幾乎相同的記錄幾列)

所以,

  • 我沒有使用*,而我只查詢所需的列
  • 我運行在非高峯時間腳本
  • 我的環境是本地主機上當前版本WAMP的
  • 我得到了一個服務器的機器,它的好運行,它

我的問題是沒有問題的,

我有一個大的數據庫包括超過14K的記錄,其需要每天更新(部分產品,我有更新的成本和數量)。當腳本運行時,它運行幾個小時,然後過,它永遠不會完成14K的記錄,而停在8K左右更新記錄..

  • 我如何管理這種類型的數據庫操作的?
  • 如何將我的數據庫操作分成兩部分/線程,以便每個部分/線程與其他部分並行運行,這樣我就可以將時間減半。這是我最關心的問題。
  • 你對這種情況有何建議?
+0

如果你通過這個過程運行一條記錄,那麼最長的部分是什麼? –

+0

號碼或紀錄,因爲它們太大,它需要很長時間 –

+1

14k個記錄是微不足道的...... – Mark

回答

2

很有可能,DB時間不是你的問題。即使每次使用新鮮(未準備好)的語句,14k條記錄也不應該是幾小時的事情(假設索引存在查找)。

(當然,你應該確認(測量)數據庫運行時的時間,太,當然你應該使用準備好的語句。)

但是,調用外部Web服務14K倍顯然需要相當長的時間!外部服務是否提供批量API?如果沒有,我建議您在查詢服務器的進一步請求時嘗試保持HTTP連接打開(活動),以減少網絡延遲。

作爲最後的優化,您可以生成一組工作進程(或線程),它們可以並行處理從DB中提取的行。

1
  • 在客戶端創建相當多的線程/子進程,如20或50,以並行更新不同部分的記錄; 在客戶端和服務器上監控您的CPU,IO和內存,並查看使用了多少資源,如果可以,請增加數量。
  • 你的數據庫客戶端的批量提交;比方說,每100行更新後才提交;
  • 確保鍵列在數據庫服務器端編入索引;
  • 在處理大量數據記錄時總是要考慮批處理。這適用於數據庫操作,Web服務,休息等。
  • 不確定您的業務邏輯,您可能希望使Web服務讀取和數據庫更新並行運行。換句話說,當某些線程正在獲取某些外部數據時,其他線程正在將數據寫入數據庫。
  • 是的,如果一個sql語句重複執行,使用預處理語句要好得多。
  • 您也可以考慮在整個過程中禁用數據參照完整性等內容,或者在發出提交命令時將數據庫設置爲強制執行。結合批量提交,這可以在數據庫服務器端節省大量時間。
相關問題