starting with liegt auch bei 0.2s.
Wie schon oben geschrieben, das Problem liegt in der Kombination like und parambyname.
Und natürlich ist ein Index auf dem Such-, wie auch auf dem Sortierfeld. Dennoch dürfte die Kombination like+parambyname nicht so extrem aus der Reihe fallen.
Und mich würde interessieren warum dem so ist.
Ich habe ein kleines Test mit einer 7 Millionen Datensatztabelle gemacht.
Nun also ohne irgendwelche externen Zugriffe über andere andere Tools/Schnittstellen.
Delphi-Quellcode:
procedure Tfmain.Button1Click(Sender: TObject);
var q : TIBQuery;
t : integer;
begin
db.DatabaseName:=eddatabasename.Text;
try
db.Connected:=TRUE;
except
on e :
exception do begin
messagedlg(e.
Message,mterror,[mbok],0);
exit;
end;
end;
q := TIBQuery.create(
nil);
try
q.unidirectional:=TRUE;
q.Database :=
db;
for t := 1
to 3
do begin
q.sql.text := '
';
q.sql.add('
select * from PROTOKOLL where ');
if t = 1
then q.sql.add('
KEY like ''
'+edsuche.text+'
%''
');
if t = 2
then q.sql.add('
KEY starting with :KEY ');
if t = 3
then q.sql.add('
KEY like :KEY ');
q.sql.Add('
order by SNR desc');
if t = 2
then q.ParamByName('
KEY').AsString := edsuche.text;
if t = 3
then q.ParamByName('
KEY').AsString := edsuche.text+'
%';
memo1.lines.add(format('
Test %d : Davor : %s',[t,formatdatetime('
hh:nn:ss:zzz',now)]));
q.open;
memo1.lines.add(format('
Test %d : Danach : %s',[t,formatdatetime('
hh:nn:ss:zzz',now)]));
q.close;
end;
finally
q.free;
end;
db.Connected:=FALSE;
end;
Davon das Ergebnis
Test 1 : Davor : 12:44:42:138
Test 1 : Danach : 12:44:42:185
Test 2 : Davor : 12:44:42:192
Test 2 : Danach : 12:44:42:195
Test 3 : Davor : 12:44:42:196
Test 3 : Danach : 12:44:54:066