Delphi запрос ADO

Есть ли любой более быстрый способ выполнить итерации через Набор данных ADO, чем

while (not ADOQuery1.Eof) do
    begin
      /* Do something */
      ADOQuery1.Next;
    end;

Я должен просканировать набор данных приблизительно 9 000 объектов и только извлечь записи, соответствующие предопределенному набору чисел ответвления.

8
задан Kromster says support Monica 31 March 2014 в 09:01
поделиться

5 ответов

Для таких задач гораздо быстрее использовать ADORecordset:

 while not ADOQuery1.Recordset.EOF do
  begin
    ADOQuery1.Recordset.MoveNext;
    // get value
    SomeVar := ADOQuery1.Recordset.Fields['FieldName'].Value;  
  end;
7
ответ дан 5 December 2019 в 06:37
поделиться

Убедитесь, что вы используете DisableControls/EnableControls, если в этом нет необходимости, чтобы не тратить время на обновление видимых элементов управления, связанных с DataSet.

try
  ADOQuery1.DisableControls;
  while (not ADOQuery1.Eof) do
    begin
      /* Do something */
      ADOQuery1.Next;
    end;
finally
  ADOQuery1.EnableControls;
end;

С уважением.

10
ответ дан 5 December 2019 в 06:37
поделиться

@Pieter, два варианта

1) вы можете изменить ваше предложение sql перед выполнением, добавив условие where, которое совпадает с заранее определенным набором номеров ветвей.

2) используя свойство Filter TAdoQuery.

AdoQuery1.close;
AdoQuery1.filter := 'your condition goes here';
AdoQuery1.filtered := true;
AdoQuery1.Open;
8
ответ дан 5 December 2019 в 06:37
поделиться

Дополнительный прирост производительности можно получить, если избегать любых сравнений строк до самого позднего момента (когда все остальное совпадает). Если в вашей базе данных имеется большое количество дубликатов строк, то рассмотрите возможность размещения строк в отдельной таблице, связанной с первой таблицей целым числом.

0
ответ дан 5 December 2019 в 06:37
поделиться

Возможно, вы захотите изменить запрос, включив в него предложение SQL where, что-то вроде

Select whatever fields From whatevertable
where branchnumber in (
    select branchnumber from whatevertable where branchid=xxz
)

Я бы также настоятельно рекомендовал рассмотреть курсоры только для чтения, чтобы обеспечить наибольшее увеличение скорости.

0
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: