从Delphi 2010到远程MySQL 5.09服务器的插入速度非常慢,这是一个很大的问题。
到目前为止,我已经尝试过:
我使用了批处理和直接插入ADO(使用表访问),并且使用Zeos我使用SQL插入查询,然后使用表直接模式和缓存更新表模式使用applyupdates和commit。使用MyDAC我使用表访问模式,然后直接插入SQL然后批量插入SQL
我尝试过的所有技术,我都设置了压缩,没有明显的区别。
到目前为止,我已经看到每秒 7.5 的记录几乎相同!!!
现在,我会从这一点开始假设远程服务器速度很慢,但MySQL Workbench的速度非常快,而且Migration toolkit可以非常快速地管理初始迁移(说实话,我不记得有多快 - 哪种意思很快)
修改1
我可以更快地将sql写入文件,通过ftp将文件上传到服务器,然后直接将其导入远程服务器 - 我想知道他们是否会限制传入的MySQL流量,但这不是解释为什么MySQL Workbench如此之快!
修改2
在最基本的层面上,代码是:
while not qMSSQL.EOF do
begin
qMySQL.SQL.Clear;
qMySQL.SQL.Add('INSERT INTO tablename (fieldname1) VALUES (:fieldname1)');
qMySQL.ParamByName('fieldname1').asString:=qMSSQL.FieldByName('fieldname1').asString;
qMySQL.ExecSQL;
qMSSQL.Next;
end;
然后我尝试了
qMySQL.CachedUpdates:=true;
i:=0;
while not qMSSQL.EOF do
begin
qMySQL.SQL.Clear;
qMySQL.SQL.Add('INSERT INTO tablename (fieldname1) VALUES (:fieldname1)');
qMySQL.ParamByName('fieldname1').asString:=qMSSQL.FieldByName('fieldname1').asString;
qMySQL.ExecSQL;
inc(i);
if i>100 then
begin
qMySQL.ApplyUpdates;
i:=0;
end;
qMSSQL.Next;
end;
qMySQL.ApplyUpdates;
现在,在带有CachedUpdates:=False
的代码中(显然从未真正写回数据库)速度非常快!!
说实话,我认为这是联系 - 我感觉这是连接......只是等着他们回到我身边!
感谢您的帮助!
答案 0 :(得分:3)
您可以尝试AnyDAC及其阵列DML功能。它可能会加速标准的SQL INSERT几次。
答案 1 :(得分:1)
很抱歉,在您提出问题之后很久就会收到此回复。
我有类似的问题。 BDS2006通过网络上的ODBC到MySQL - 运行25分钟 - 每秒25次插入。我正在使用TDatabase连接并将TTable Tquery附加到它。编写了SQL语句。
主要的改进是当我开始在循环内开始交易时。一个简单的例子,Memebrships有会员期。在插入成员资格和成员之前启动事务,在之后提交。会员数量为01585,在交易之前处理所有会员记录需要279.90秒,但是花费了6.71秒。
几乎无法相信,我仍在努力修复其他慢速代码。
也许马克你已经解决了你的问题,但它可能会帮助别人。
答案 2 :(得分:0)
我不确定ZeosLib,但是使用ADO和ODBC驱动程序,你将无法获得插入记录的最快方法,这里只需几步就可以让你的插入更快:
使用Mydac进行直接访问,它们可以在没有慢速ODBC的情况下工作。 ADO> OLEDB> MySqlLib连接到Mysql。
在插入之前首先打开连接。
如果您有大量插入,例如1000或更多,请尝试使用事务并在100记录或更多后提交取决于记录数。
即使使用ZeosLib或ADO,第3点也可能使您的插入更快。
答案 3 :(得分:0)
您使用的是查询参数吗?插入的最快方法应该是使用普通查询和参数(即INSERT INTO表(字段)VALUES(:field)),准备查询,然后在单个事务中分配参数并执行多次 - 最后提交(不要使用任何风格的自动提交)
在大多数数据库中,每次执行查询时都会避免硬分析,这需要时间。参数允许查询仅解析一次,然后根据需要重新执行多次。
使用服务器设备检查发生了什么 - 许多人提供了检查正在运行的语句正在做什么的方法。
答案 4 :(得分:0)
这里有两个不同的事情。首先,您的Delphi程序正在创建Insert语句并将它们发送到DB服务器,然后服务器正在处理它们。您需要检查两端以找到瓶颈。我不熟悉MySql工具,但我敢打赌你可以很容易地找到一个SQL分析器。使用它来分析Delphi应用程序中的插入,并将其与Workbench工具中的运行插入进行比较,看看是否存在显着差异。
如果没有,那么减速就在您的应用中。尝试将它连接到Sampling Profiler或其他一些了解Delphi的分析工具,它会向您展示您花费大量时间的地方。一旦你知道了,那么你可以解决这个问题,或者回到这里问一个更具体的问题。但是,除非你知道问题的来源,否则你在这里得到的任何答案都将是最好的教育猜测。