我在我的网络(Mariadb 10.3.24)上运行Mysql服务器,并在相同的数据、相同的机器上使用dbexpress和firedac进行了性能测试,没有其他用户访问数据库。我使用的是Delphi10.1,并且没有对连接或查询组件的设置进行任何更改。
我的发现是(记录总数为261.000):
Reading 100.000 records without a "where-clause"
Firedac : 184 sec
DBexpress: 93 sec
Reading 100.000 records with a where clause (indexed)
Firedac: 160 sec
DBexpress: 86 sec我所有的程序都是用Firedac编写的,有没有一种简单的方法来加速Firedac,或者我需要切换到dbexpress才能获得不错的性能?
我的测试(与dxexpress和firedac相同):
var start, slut : tdatetime;
n : integer;
begin
start := now;
listbox1.Items.Clear;
sqlq.Close;
sqlq.SQLConnection:=sqlcon;
sqlq.SQL.Clear;
sqlq.SQL.Add('select * from forsendelser where kundenummer="test" limit '+spinedit1.Text);
sqlq.Open;
while not sqlq.Eof do begin
listbox1.Items.Add(sqlq.FieldByName('stregkode').AsString );
sqlq.Next;
end;
sqlq.Close;
n :=SecondsBetween(Now, start);
edit2.Text:=n.ToString;
end;发布于 2021-06-22 10:55:01
有几件事可以用你的代码来提高性能。
首先,在循环期间不更新ListBox.Items,因为每次添加或删除项时,屏幕都必须更新。当循环运行时,这是不需要的。
第二,停止在循环中使用FieldByName。它强制搜索表的字段,以便在每次执行循环时找到该字段,这是不必要的。您可以在循环运行之前获取字段,将其存储在变量中,并通过循环中的该变量访问它。
这应该会大大提高您的性能。
var
start: TDateTime;
n: Integer;
Fld: TField;
begin
start := now;
ListBox1.Items.BeginUpdate;
try
listbox1.Items.Clear;
sqlq.Close;
sqlq.SQLConnection := sqlcon;
sqlq.SQL.Text := 'select * from forsendelser where kundenummer="test" limit ' + spinedit1.Text;
sqlq.Open;
Fld := sqlq.FieldByName('stregkode');
while not sqlq.Eof do
begin
listbox1.Items.Add(Fld.AsString);
sqlq.Next;
end;
sqlq.Close;
finally
ListBox1.Items.EndUpdate;
end;
n :=SecondsBetween(Now, start);
edit2.Text:=n.ToString;
end;https://stackoverflow.com/questions/68070236
复制相似问题