Delphi: is DBexpress faster than Firedac



我在网络上运行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;

最新更新