【问题标题】:Batch Move Data from TADOTable to MySQL TMyTable将数据从 TADOTable 批量移动到 MySQL TMyTable
【发布时间】: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


【解决方案1】:

不是真正的答案,但我在 cmets 中的空间不足。

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;

【讨论】:

  • 你可能是对的,它可能是因为索引重建。通过在每个插入语句中使用 1000 行的批量插入,我可以获得更好的性能。我将尝试禁用索引并尝试这样做。
  • +1,因为您为 OP 提供了有关如何解决他的问题的各种选项。不过,我建议详细说明 Zeos 部分(为什么它是一个可以提供帮助的选项?)。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2012-02-20
  • 2012-05-27
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多