【发布时间】:2012-12-06 01:59:53
【问题描述】:
我正在尝试使用 CRBatchMove 使用 Delphi 2007 将旧数据库 (MS Access) 中的表导入 MySQL 服务器。
程序通过 ODBC 连接从旧数据库中获取数据,并使用 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 服务器这么慢。有没有办法加快这项任务?还是有更好的方法来实现这一点?
【问题讨论】:
-
不看代码很难说。这可能与您在 TMyTable 以及随后在 MySQL 中插入数据的方式有关,例如,如果这会触发 MySQL 上每一行的索引更新。
-
您在使用事务吗?它可能会大大加快插入速度。
-
MySQL 有一个名为
load data infile的函数,请参阅:dev.mysql.com/doc/refman/5.1/en/load-data.html 您可以使用它来计算插入数据的最快时间。这将为您提供 MySQL 中插入时间的基线,并允许您确定延迟是在 MySQL 中还是在 Delphi 中。如果您有 TMyTable 的源代码,也可以使用分析器。
标签: delphi data-migration devart