Самый быстрый способ найти запись в наборе результатов TQuery - PullRequest
5 голосов
/ 08 августа 2011

Мне интересно, как лучше всего (читай: быстрее) найти запись в наборе результатов оператора Tquery SQL.

До сих пор я использую TQuery.Locate, и если я прав, то это единственный оператор, который можно использовать для поиска в наборе результатов. Итак, как мы можем оптимизировать это?

У меня есть несколько идей, но у меня еще не было времени сравнить их все на больших наборах данных:

Допустим, у нас есть таблица со следующими полями:

Create Table aTable (
 ID int, 
 Name1 varchar(50), 
 Name2 varchar(50));

И следующий запрос:

SELECT ID, Name1, Name2 from aTable

Мы хотим найти запись по ее идентификатору в результирующем наборе

  • Будет ли локализация быстрее, если aTable имеет индекс по идентификатору?
  • Будет ли поиск быстрее, если я добавлю «Order By ID» в оператор SQL?

Есть идеи по этому поводу?

[Редактировать] Чтобы пояснить использование этого: Запрос выполняется Reportavder Dataview, а затем становится доступным через линию данных (которая является TQuery.Dataset). В пользовательском отчете мне нужно пройти конвейер на основе некоторого идентификатора более высокого уровня. Так что НЕ использование запроса здесь не применимо. Мне просто интересно, ускорит ли что-нибудь из моих предложений выше.

Ответы [ 3 ]

4 голосов
/ 08 августа 2011

Вот несколько советов, которые могут вам пригодиться

  • Использовать метод Locate () только для индексированных столбцов
  • Использовать "порядок по" ТОЛЬКО в индексированных столбцах
  • Использовать подготовку перед открытием запроса
  • Использовать DisableControls / EnableControls
  • Используйте индекс Ascending / Descending (или оба) в зависимости от ваших потребностей
  • Попробуйте FastReports

Если у вас есть основная / подробная информация для больших наборов данных, НЕ извлекайте все подробные записи - другими словами - не используйте локальную главную деталь - пусть механизм БД выдаст вам только нужные записи.

1 голос
/ 08 августа 2011

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

0 голосов
/ 08 августа 2011

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

В представлении ReportBuilder Данные перейдите на Конструктор запросов , затем на вкладку Поиск , затем добавьте настройку поля с помощью «Автоматический поиск» опция.

Затем перейдите в представление ReportBuilder Calc , выберите «Вид / События» в меню. Щелкните корневой элемент Отчет в древовидном представлении «Объект отчета», затем дважды щелкните «OnGetAutoSearchValues» и получите ожидаемое значение:

var
    Fld : TppAutoSearchField;
    i   : integer;     
begin
  for i:=0 to Report.AutoSearchFieldCount-1 do
  begin
   Fld := Report.AutoSearchFields[i];

    if Fld<>nil then
    begin    
      if (Fld.FieldName='FIRST_PARAM') then 
      begin
        Fld.SearchExpression := .....;
      end
      else if (uppercase(Fld.FieldName)='2ND_PARAM') then
      begin 
        Fld.SearchExpression := intToStr(...);
      end;
    end;
  end;  
end;
...