Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.23;
Скачать: CL | DM;

Вниз

sql запрос выполняется медленнее lookup   Найти похожие ветки 

 
LDV   (2010-11-02 16:23) [0]

написал тестовое приложение, которое пробегает по всем записям таблицы "Items", передает значение поля "item_id" в качестве параметра в функцию get, которая возвращает значение поля в таблице "Content" исходя из переданного item_id.

Сделал 2 варианта поиска:

1-й через запрос


procedure TFormTest.Test;

 function get_val(const fld_name: string; item_id: Integer): string;
 begin
   Ftmp_query.DatabaseName := cmp_db.DataBaseName;
   Ftmp_query.SessionName  := cmp_db.SessionName;
   Ftmp_query.SQL.Text := Format("SELECT %s FROM content WHERE item_id = %d",
     [fld_name, item_id]);
   Ftmp_query.Open;
   Result := Ftmp_query.Fields[0].AsString;
 end;

begin
 Fquery_items.First;
 while not Fquery_items.Eof do
 begin

   get_val("item_id", Fquery_items[0].AsInteger);

   Fquery_items.Next;
 end;

end;


2-й c использование Lookup


procedure TFormTest.Test;

 function get_val(const fld_name: string; item_id: Integer): string;
 begin
   Result := Fquery_content.Lookup("item_id", item_id, fld_name);
 end;

begin
 Fquery_items.First;
 while not Fquery_items.Eof do
 begin

   get_val("item_id", Fquery_items[0].AsInteger);

   Fquery_items.Next;
 end;
end;


При пробеге 5000 записей вариант с lookup выполняется в 2,5 раза быстрее, почему?


 
clickmaker ©   (2010-11-02 17:01) [1]

а что странного? лукап выполняется в памяти, накладных расходов на связь с базой и запрос из нее нету


 
12 ©   (2010-11-02 17:01) [2]

а так?

procedure TFormTest.Test;

function get_val(item_id: Integer): string;
begin
 Ftmp_query.close
 Ftmp_query.parametrs.parambyname("p2").asinteger := item_id;
  Ftmp_query.Open;
  Result := Ftmp_query.Fields[0].AsString;

end;

begin
Fquery_items.First;
Ftmp_query.DatabaseName := cmp_db.DataBaseName;
Ftmp_query.SessionName  := cmp_db.SessionName;
Ftmp_query.SQL.Text := "SELECT item_id FROM content WHERE item_id = :p2";
Ftmp_query.prepare;
while not Fquery_items.Eof do
begin

  get_val(Fquery_items[0].AsInteger);

  Fquery_items.Next;
end;

end;



Страницы: 1 вся ветка

Текущий архив: 2011.01.23;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.007 c
2-1288624179
cyber-pilot
2010-11-01 18:09
2011.01.23
Как перехватить вставку из буфера в комбобокс?


2-1288154961
Делфиец
2010-10-27 08:49
2011.01.23
Чем преобразовать UTF-8 в Windows-1251


4-1243613031
GanibalLector
2009-05-29 20:03
2011.01.23
Номер порта на модеме


2-1288134132
Германн
2010-10-27 03:02
2011.01.23
Работа с "хранилищем объектов" (Repository)


4-1243758013
Unknown user
2009-05-31 12:20
2011.01.23
IsHandleValid?