2011-05-02 83 views
2

我對perl dbi中嵌套窗體中處理sql的性能有疑問。關於嵌套sql的Perl DBI性能

bascially,什麼腳本正在做的是

從DBI

while循環中,

使用連接到DB1

連接到DB2

獲取數據來自DB1的數據並創建更新或插入語句

從DB2在DB2中執行SQL

disconenct

斷開DB1

現在的問題是,這是最好的做法,當涉及到性能或以下的方法是最好的選擇。從DB1

獲取日期

將數據寫入到一個臨時文件

從臨時文件中獲取數據

process the data to udpate in DB2. 

編輯:我添加了一些連接到DB2後連接到DB1。但那不是我想要創造的點。這更多的是關於服務器從存儲數據的數據庫服務器和磁盤讀取的I/O和系統調用的性能問題。

如果你看看第一種方法。

內部循環。 腳本從DB1 獲取一行數據,並等待在DB2中處理返回的數據。

如果有成千上萬的記錄,什麼時候你在做系統的thousnds對性能的影響服務器調用從磁盤讀取數據

+4

連接到DB在while循環不是一個好主意。您應該在腳本的開頭連接到DB2。在這一點上,我沒有看到其他的東西在第一段代碼中有所改進。 – 2011-05-02 18:26:57

回答

1

斷開,如果有成千上萬的記錄,什麼時候你在做系統的thousnds對性能的影響調用服務器讀取來自磁盤的數據

成千上萬的記錄,這並不多,因爲典型的小記錄或平均記錄大小。您不知道數據是從磁盤實際讀取,還是駐留在內存中的緩衝區中。所以你不能確定系統調用的數量。你爲什麼要打擾?

如果性能對您很重要,我建議您在典型的現實生活場景中測試兩種方法。

如果你正在處理一個鎖定數據庫和一個長期運行的進程(無論出於何種原因),最好一次獲得你需要的所有數據(staging file method),這樣你就不會持有在整個處理過程中鎖定源和目標服務器。

您的選擇也可能取決於您對工具或API的熟悉程度以進行批量導入數據。例如,用於MSSQL的bcp.exe是用於導出和導入數據的便捷工具。大多數其他數據庫都有類似的工具

2

我只有用Perl溫和的經驗,但處理Perl和數據庫的工作。據我瞭解,通常最好連接到循環外的數據庫 - 這樣可以最大限度地減少連接,斷開連接和重複連接的開銷。

所以...

連接到DB1

連接到DB2

從DB1獲取一個while循環中,從DB1

數據

使用數據,並創建一個更新 或insert語句

執行DB2中的sql

從DB1斷開DB2

0

我會建議這樣做並行,例如,在腳本中使用pipe()fork()。否則大多數時候你會等待網絡IO。所以它就像

(SELECT, serialize, print) | (read line, deserialize, INSERT_OR_UPDATE)