Есть ли любой более быстрый способ выполнить итерации через Набор данных ADO, чем
while (not ADOQuery1.Eof) do
begin
/* Do something */
ADOQuery1.Next;
end;
Я должен просканировать набор данных приблизительно 9 000 объектов и только извлечь записи, соответствующие предопределенному набору чисел ответвления.
Для таких задач гораздо быстрее использовать ADORecordset:
while not ADOQuery1.Recordset.EOF do
begin
ADOQuery1.Recordset.MoveNext;
// get value
SomeVar := ADOQuery1.Recordset.Fields['FieldName'].Value;
end;
Убедитесь, что вы используете DisableControls/EnableControls, если в этом нет необходимости, чтобы не тратить время на обновление видимых элементов управления, связанных с DataSet.
try
ADOQuery1.DisableControls;
while (not ADOQuery1.Eof) do
begin
/* Do something */
ADOQuery1.Next;
end;
finally
ADOQuery1.EnableControls;
end;
С уважением.
@Pieter, два варианта
1) вы можете изменить ваше предложение sql перед выполнением, добавив условие where, которое совпадает с заранее определенным набором номеров ветвей.
2) используя свойство Filter TAdoQuery.
AdoQuery1.close;
AdoQuery1.filter := 'your condition goes here';
AdoQuery1.filtered := true;
AdoQuery1.Open;
Дополнительный прирост производительности можно получить, если избегать любых сравнений строк до самого позднего момента (когда все остальное совпадает). Если в вашей базе данных имеется большое количество дубликатов строк, то рассмотрите возможность размещения строк в отдельной таблице, связанной с первой таблицей целым числом.
Возможно, вы захотите изменить запрос, включив в него предложение SQL where, что-то вроде
Select whatever fields From whatevertable
where branchnumber in (
select branchnumber from whatevertable where branchid=xxz
)
Я бы также настоятельно рекомендовал рассмотреть курсоры только для чтения, чтобы обеспечить наибольшее увеличение скорости.