2012-12-18 38 views
0

我試圖使用德爾福2007年批從TADOTable將數據移動到MySQL的TMyTable

程序從傳統數據庫通過ODBC獲取數據的舊數據庫(MS Access)與MySQL服務器使用CRBatchMove導入表連接並使用TADOTable.SaveToFile()將其存儲在本地硬盤上。程序的第二部分將該文件讀入另一個TADOTable,並使用TCRBatchMove將其轉移到MySQL服務器(通過DevArt的TMyTable)。在這個過程中,出於某種原因,批量移動看起來非常慢。

以下試驗中的數據量約爲100,000條記錄,每條記錄約有120個字段。大多數字段是整數和VARCHAR(每個VARCHAR少於32個字符)。

我所獲得的性能數據是:

Time taken to bring data to local file over ODBC connection: 17 seconds 
Time taken to load data from local file into TADOTable: 3 seconds 
Time taken by TCRBatchMove to move data from TADOTable to TMyTable: > 30 minutes 

MySQL服務器的開發機器上本地運行(這是一個i7-2.8GHz)和數據庫,否則是非常快)。

爲什麼批量移動將數據推送到MySQL服務器的速度如此之慢。有沒有辦法加快這項任務?還是有更好的方法來完成這個?

+1

硬盤沒有看到代碼的說。這可能與您在TMyTable中隨後在MySQL中插入數據的方式有關,例如,如果這在每個行上觸發MySQL上的索引更新。 –

+1

您使用的是交易嗎?它可能會加速插入。 –

+0

MySQL有一個名爲'load data infile'的函數,請參閱:http://dev.mysql.com/doc/refman/5.1/en/load-data.html您可以使用它來儘可能快地插入數據。這將爲您提供插入MySQL時間的基準,並讓您確定延遲是在MySQL還是Delphi中。如果您有TMyTable的源代碼,則也可以使用分析器。 – Johan

回答

1

不是一個真正的答案,但我在評論中的空間不足。

MySQL有一個叫load data infile
見功能:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

你可以用它來時間最短的時間內插入數據。這將爲您提供插入MySQL時間的基準,並讓您確定延遲是在MySQL還是Delphi中。如果您有TMyTable的源代碼,則也可以使用分析器。

另一種選擇是下載ZEOS數據訪問組件:
http://sourceforge.net/projects/zeoslib/
如果有在你使用的工具集的變化可能會解決問題的組件一些天翻地覆。 (儘管Devart的組件通常很棒)。

在MySQL端,您可以在批量插入之前禁用索引更新,然後啓用索引。如果你有很多插入通常更快。
請參閱:https://stackoverflow.com/a/9524988/650492

SET autocommit=0; 
SET unique_checks=0; 
SET foreign_key_checks=0; 

your insert here 

SET autocommit=1; 
SET unique_checks=1; 
SET foreign_key_checks=1; 
+0

你可能是對的,它可能是因爲索引重建。通過在每個插入語句中使用1000行的批量插入,我可以獲得更好的性能。我會嘗試禁用索引並嘗試。 – ssh

+0

+1,因爲你給OP提供了關於如何解決他的問題的各種選項。儘管如此,我會建議精心策劃Zeos部分(爲什麼它可以提供幫助?)。 –