2012-12-18 42 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部分(为什么它可以提供帮助?)。 –