我正在尝试导入一个表从一个旧的数据库(MS Access)到MySQL服务器使用CRBatchMove使用Delphi2007。
该程序通过ODBC连接从遗留数据库获取数据,并使用TADOTable.SaveToFile()将其存储在本地硬盘驱动器上。程序的第二部分将该文件读取到另一个TADOTable中,并使用TCRBatchMove将其传输到MySQL服务器(通过DevArt的TMyTable)。在此过程中,由于某些原因,批处理移动似乎非常慢。
以下试验中的数据量约为100,000条记录,每个记录约有120个字段。大多数字段是integers和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 minutesMySQL服务器在本地的开发机器(i7-2.8 the )上运行,另外数据库也非常快)。
为什么批量移动将数据推送到MySQL服务器会如此缓慢。有没有办法加速这项任务?或者,有没有更好的方法来实现这一点?
发布于 2012-12-20 01:36:13
不是一个真正的答案,但我的评论空间快用完了。
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;https://stackoverflow.com/questions/13940154
复制相似问题