Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Вниз

Ускорить работу с БД   Найти похожие ветки 

 
Ega23 ©   (2009-02-27 15:57) [0]

1. Postgres 8.2, Postgres ANSI ODBC Driver
2. Delphi 7, TADODataSet

Смысл такой.
На сервере создаётся абсолютно тупая таблица:

create table test_tbl (
  unid                 int4                 not null default nextval("seq_test_unid"::regclass),
  aname                varchar(32)          not null,
  lastupdated          timestamp            not null default "cast(now() as timestamp)",
  constraint pk_test_tbl primary key (unid)
);


Дальше она тупо заполняется, 100.000 записей (aname - IntToStr(Random(....))

Есть следующие классы:


 TSimpleRecord = class (TObject)
 public
   ID : Integer;
   Name : string;
   constructor Create(ads : TADODataSet);
 end;

 TSimleRecordList = class (TObjectList)
 private
   function GetItem(Index: Integer): TSimpleRecord;

 public
   property Items[Index : Integer] : TSimpleRecord read GetItem;
   procedure LoadFromDataSet(ads : TADODataSet);

 end;

{ TSimpleRecord }

//*****************************************************************************

constructor TSimpleRecord.Create(ads: TADODataSet);
begin
 ID := ads.FieldByName("unid").AsInteger;
 Name := ads.FieldByName("aname").AsString;
end;

//*****************************************************************************

{ TSimleRecordList }

//*****************************************************************************

function TSimleRecordList.GetItem(Index: Integer): TSimpleRecord;
begin
 Result := TSimpleRecord(inherited GetItem(Index));
end;

//*****************************************************************************

procedure TSimleRecordList.LoadFromDataSet(ads: TADODataSet);
begin
 if ads.IsEmpty then Exit;
 ads.First;
 while not ads.Eof do
 begin
   Add(TSimpleRecord.Create(ads));
   ads.Next;
 end;
end;



Делаю select * from  и результат загоняю в лист.

Так вот, само открытие и передача данных происходит ~ за 3 секунды. А вот наполнение листа ~ 170 секунд.
Вопрос: а можно ли это дело как-то ускорить?

З.Ы. Заранее предупреждая замечания "нефиг тащить столько записей на клиент" - я в курсе, что столько нельзя. Вот только пользователи не в курсе и фильтрами не любят пользоваться. В любом случае в данный момент это просто исследование.


 
Виталий Панасенко   (2009-02-27 16:12) [1]


> Так вот, само открытие и передача данных происходит ~ за
> 3 секунды.

с чего решение, что данные ПЕРЕДАЛИСЬ?
они передаются там, где "170 секунд".. данные все сразу не фетчатся.. сделай FetchAll (если есть такой метод) или Last/First


 
Palladin ©   (2009-02-27 16:23) [2]

Выставь, перед выполнением запроса, свойства датасета
CursorLocation:=clUseServer;
CursorType:=ctOpenForwardOnly;
LockType:=ltReadOnly;

и сравни


 
Ega23 ©   (2009-02-27 16:25) [3]


> с чего решение, что данные ПЕРЕДАЛИСЬ?
> они передаются там, где "170 секунд".. данные все сразу
> не фетчатся.. сделай FetchAll (если есть такой метод) или
> Last/First


Да я как-бы не первый день замужем, это проверил в первую очередь.
З.Ы. Сам удивлён безмерно. Вроде бы тупая операция - обойти датасет...


 
sniknik ©   (2009-02-27 16:28) [4]

procedure TSimleRecordList.LoadFromDataSet(ads: TADODataSet);
begin
 if ads.IsEmpty then Exit;
 ads.First;
 while not ads.Eof do
 begin
   Add(TSimpleRecord.Create(ads));
   ads.Next;
 end;
end;

http://delphimaster.net/view/2-1235121964/


 
Ega23 ©   (2009-02-27 16:29) [5]

ЁПРСТ!

procedure TSimleRecordList.LoadFromDataSet(ads: TADODataSet);
begin
 if ads.IsEmpty then Exit;

 ads.DisableControls;
 try

   ads.First;
   while not ads.Eof do
   begin
     Add(TSimpleRecord.Create(ads));
     ads.Next;
   end;
 finally
   ads.EnableControls;
 end;
end;



Ускорение на 2 порядка.
Сейчас с курсорами поиграюсь, может ещё что-то выжму...


 
Palladin ©   (2009-02-27 16:30) [6]


> ЁПРСТ!

хе :)...


 
Ega23 ©   (2009-02-27 16:31) [7]


> sniknik ©   (27.02.09 16:28) [4]


Ага, это я уже косяк упорол. Посчитал, что если никаких DataSource с ним не связано, то и фиг с ним. Но чтобы ТАКОЙ прирост производительности - не ожидал, чесслово!


 
Ega23 ©   (2009-02-27 17:09) [8]


> Выставь, перед выполнением запроса, свойства датасета


А вот эти дела только хуже сделали. Хотя - странно.
На выходных дома поэксперементирую более серьёзно. Но тут у меня уже на драйвер постгресовский подозрение...


 
sniknik ©   (2009-02-27 17:33) [9]

> Посчитал, что если никаких DataSource с ним не связано
ну ты тут не одинок Игорь Шевченко там вон тоже считает, что внутренние проверки отключать не надо...

+ у тебя еще можно выиграть "пару тройку милисекунд" если вынести поиск объектов полей ads.FieldByName("unid"), ads.FieldByName("aname") за цикл.

а еще больше если никуда данные не переносить, а так и держать локально/работь и ними в рекордсете... это же готовая структура для данных, нафига перекладывания?


 
Palladin ©   (2009-02-27 17:43) [10]


> это же готовая структура для данных, нафига перекладывания?

ну... у простого (или хитрого, с отсортированными id и бинарным поиском по ним) списка доступ к данным быстрее... и словари так кэшировать на клиенте проще...


 
sniknik ©   (2009-02-27 18:12) [11]

> ну... у простого (или хитрого, с отсортированными id и бинарным поиском по ним) списка доступ к данным быстрее...
думаешь? ... мы тут как то "мерялись" сортировкой по id c "супербыстрым" стринглистом специально заточенным под это... и  в общем разница была небольшая. т.е. в первый раз небольшая (ADODataSet проиграл), а второй и последующие разы ADODataSet просто подключал уже готовый индекс (время соответственно = 0), а стриглист давал тоже самое, хотя надо признать довольно маленькое время.

> и словари так кэшировать на клиенте проще...
? после запроса с локальным курсором, рекордсет практически готовый кэш, куда проще то?


 
Palladin ©   (2009-02-27 18:36) [12]

ну... то что я сказал больше справедливо для трех и более звенных приложений... ) которые пытаются не быть зависимыми от СУБД в частности и АДО в целом )


 
Ega23 ©   (2009-02-28 10:47) [13]


> а еще больше если никуда данные не переносить, а так и держать
> локально/работь и ними в рекордсете... это же готовая структура
> для данных, нафига перекладывания?


Так я же и говорю: как раз research провожу. Пробую всякие разные способы.


 
b z   (2009-02-28 11:27) [14]


> constructor TSimpleRecord.Create(ads: TADODataSet);
> begin
>  ID := ads.FieldByName("unid").AsInteger;
>  Name := ads.FieldByName("aname").AsString;
> end;
Здесь не надо приватных полей, раз уж передали датасет, то и продолжайте по средствам инкапсуляции работать с ним.

А ...,  если вы хотите типа своего орма, идите в .NET, там уже и этого не надо. :)


 
Ega23 ©   (2009-02-28 12:07) [15]


> Здесь не надо приватных полей, раз уж передали датасет,
> то и продолжайте по средствам инкапсуляции работать с ним.


Здесь нужно ровно то, что нужно мне.


> идите в .NET, там уже и этого не надо. :)


Знаете, с советами "идите в дотнет", "пишите на джаве", "Postgres - г..но, используйте Oracle" и т.п.  - идите на сайт к Каганову.


 
b z   (2009-02-28 12:22) [16]


> Ega23 ©   (28.02.09 12:07) [15]
Что вы такой недотрога, если у вас -"нужно ровно то, что нужно мне", зачем тут спрашивать? базар он и есть базар, т.е. форум как часто говорит Anatoly Podgoretsky.


 
b z   (2009-02-28 12:26) [17]


> Знаете, с советами "идите в дотнет"
Тем более, что это не отменяет Delphi. :)


 
b z   (2009-02-28 13:57) [18]


> Ega23 ©
Дабы скрасить и все такое :) считаю, что вам надо голубой значок! (ИМХО, хотя и против "ИМХО" как такового)


 
Ega23 ©   (2009-02-28 16:42) [19]


> Что вы такой недотрога, если у вас -"нужно ровно то, что
> нужно мне", зачем тут спрашивать? базар он и есть базар,
>  т.е. форум как часто говорит Anatoly Podgoretsky.


Гм... Мне казалось, что я вопрос сформулировал предельно чётко.


> считаю, что вам надо голубой значок!


Я так не считаю, есть гораздо более достойные кандидаты.



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

Форум: "Базы";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
2-1261799017
Igor2010
2009-12-26 06:43
2010.02.28
кодировка


15-1261231186
QAZ
2009-12-19 16:59
2010.02.28
дата=число


15-1260971239
Артур Пирожков
2009-12-16 16:47
2010.02.28
НЕ програмное выполнение несложной задачи


2-1261679750
TComponent
2009-12-24 21:35
2010.02.28
Позиция курсора в ячейке DBGrid


15-1261088240
Германн
2009-12-18 01:17
2010.02.28
BkSOD в Висте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский