我在网络上运行Mysql服务器(Mariadb 10.3.24(,并在数据库上没有其他用户的情况下,在相同的数据、相同的机器上使用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;
可以用代码做一些事情来提高性能。
从循环期间不更新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;