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

Вниз

Неравномерность скорости выборки из базы...   Найти похожие ветки 

 
SergP.   (2006-09-07 17:38) [0]


var
 fieldline:string;
...

with TADODataSet.Create(Application)do
 try
   Connection:=....;
   CommandText:=....;
   Open;
       while not eof do
       begin
         fieldline:=Fields[0].AsString+#13#10;
         ...
         Next;
       end;
 finally
   free;
 end;


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

Из-за чего?

И можно ли как-то ускорить процесс?
В выборке порядка 5000 записей...
мне нужно выполнить запрос, потом один раз "пробежаться" по датасету и уничтожить его... Может для такого случая есть какое-то решение, которое даст большую скорость?


 
Ega23 ©   (2006-09-07 17:43) [1]

Я бы заменил fieldline:string; на fieldline:TStringList;
и в цикле
fieldline.Add(Fields[0].AsString)

Ещё перед началом и в конце я бы DisableControls и EnableControls поставил.


 
SergP.   (2006-09-07 17:50) [2]

> Я бы заменил fieldline:string; на fieldline:TStringList;
>
> и в цикле
> fieldline.Add(Fields[0].AsString)


А на WIN98 данные влезли бы в TStringList, если там общий размер в несколько Мб?


> Ещё перед началом и в конце я бы DisableControls и EnableControls
> поставил.


Это зачем?


 
Desdechado ©   (2006-09-07 17:58) [3]

> А на WIN98 данные влезли бы в TStringList, если там общий
> размер в несколько Мб?
Ограничения на длину строки - 2 Гб, на кол-во строк в листе - 2 с гаком миллиарда. Хватит?

> мне нужно выполнить запрос, потом один раз "пробежаться"
> по датасету и уничтожить его..
Используй однонаправленный датасет, а не кэширующий.


 
SergP.   (2006-09-07 18:03) [4]

> > А на WIN98 данные влезли бы в TStringList, если там общий
>
> > размер в несколько Мб?
> Ограничения на длину строки - 2 Гб, на кол-во строк в листе
> - 2 с гаком миллиарда. Хватит?


Разве на WIN98 ограничение не в 64 кб?


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


Че-нить почитать про однонаправленные датасеты не посоветуете?
Или может примерчик приведете?


 
Desdechado ©   (2006-09-07 18:14) [5]

ADO не использую, не знаю, какие там однонаправленные.
Поищи в справке unidirectional dataset


 
ANB ©   (2006-09-07 18:21) [6]

Имхо - тормоза начинаются из-за кэширования ранее прочитанных записей. Значит - однозначно однонаправленный курсор и лучше серверный.


 
~Slymius   (2006-09-08 06:19) [7]

я так понял нужно составить 1 стр%E
Eку из значений таблицы?
самое тормознутое %F
Dто фрагментация памяти при конкатенации стр%E
Eк-
fieldline:=fieldline+Fields[0].AsString+#13#10;
вариант уж
е предложили - [1]
ANB ©   (07.09.06 18:21) [6]
кэшир%
EEвания ранее прочитанных записей

с чего %
E2друг? только при нехватки памяти... автор не
упомянул что у него P1 133/16


 
Slym(RO)   (2006-09-08 07:07) [8]

Повторюсь... пред пост покоцался
я так понял нужно составить 1 строку из значений таблицы?
самое тормознутое это фрагментация памяти при конкатенации строк-
fieldline:=fieldline Fields[0].AsString #13#10;
вариант уже предложили - [1]
ANB ©   (07.09.06 18:21) [6]
кэширивания ранее прочитанных записей

с чего вдруг? только при нехватки памяти... автор не упомянул что у него P1 133/16


 
sniknik ©   (2006-09-08 09:12) [9]

>> Ещё перед началом и в конце я бы DisableControls и EnableControls поставил.
абсолютно справедливое и полезное замечание
> Это зачем?
попробуй и узнаеш

однонаправленный курсор для скорости не поможет, быстрее всего "пробежка" по локальному уже выкачанному на клиента рекордсету (даже учитывая, т.е. + время выкачивания). проверялось не раз.

> вариант уже предложили - [1]
хороший вариант, тормоза на перераспределении памяти от все больше и больше растущего размера строки убирает, но... ;) есть вариант еще лучше - ничего никуда не передавать, работать со списком строк рекордсете/рекордсетом (ну вот чем он, этот список, лучше стал от того что его передали с стринг лист?)

ну и еще возможные тормоза в "волшебных" пузырьках.. н... то есть точках
здесь
       begin
        fieldline:=Fields[0].AsString+#13#10;
        ...
        Next;
      end;

а именно, если там например есть обращение к RecNo, то его надо убрать. (ну может быть еще чтото неожиданное)


 
SergP ©   (2006-09-08 09:50) [10]

> а именно, если там например есть обращение к RecNo, то его
> надо убрать. (ну может быть еще чтото неожиданное)


Обращение в RecNo есть... Неужели из-за него может тормозить?
Ладно. Поставлю тогда счетчик


 
SergP ©   (2006-09-08 09:58) [11]

> ну вот чем он, этот список, лучше стал от того что его передали
> с стринг лист?)


Тем чтио мне нужно ве потом сохранить в файл в формате:
значение поля (единственного) + #13#10
и так далее.


 
SergP.   (2006-09-08 10:33) [12]

> >> Ещё перед началом и в конце я бы DisableControls и EnableControls
> поставил.
> абсолютно справедливое и полезное замечание
> > Это зачем?
> попробуй и узнаеш


Блин... А действительно помогло...


> [1] Ega23 ©   (07.09.06 17:43)


Шаман, однако...

А теперь рассказать можно почему так?

А то я в поисковиках искал, нашел во такое:

*DisableControls* запрещает обновления состояния контролам, связанным с датасетом и увеличивает счетчик вызовов на 1. Если датасет выступает в роли мастера, то обновления запрещаются и для связанного датасета.


Но у меня нет контролов связаных с датасетом...


 
sniknik ©   (2006-09-08 11:25) [13]

> Обращение в RecNo есть... Неужели из-за него может тормозить?
опять таки, попробуй...

> А теперь рассказать можно почему так?
в код загляни. а в общем, избегаются лишние проверки, проверка той же связи контролов с рекордсетом.


 
SergP.   (2006-09-08 11:33) [14]

> [13] sniknik ©   (08.09.06 11:25)
> > Обращение в RecNo есть... Неужели из-за него может тормозить?
>
> опять таки, попробуй...


Я его уже успел убрать и заменить инкрементирущейся в цикле переменной... Но для эксперимента снова попробовал.
Действительно включились тормоза...

Всем огромное спасибо!!!


 
Desdechado ©   (2006-09-08 11:35) [15]

sniknik ©   (08.09.06 09:12) [9]
> однонаправленный курсор для скорости не поможет, быстрее всего
> "пробежка" по локальному уже выкачанному на клиента рекордсету
Может, это в ADO так. Но в dbExpress однонаправленный курсор самый быстрый, поскольку он не хранит данных, а только имеет текущую строку. А фетч одной строки достаточно быстрая операция.


 
SergP.   (2006-09-08 12:39) [16]

> [15] Desdechado ©   (08.09.06 11:35)
> sniknik ©   (08.09.06 09:12) [9]
> > однонаправленный курсор для скорости не поможет, быстрее
> всего
> > "пробежка" по локальному уже выкачанному на клиента рекордсету
> Может, это в ADO так. Но в dbExpress однонаправленный курсор
> самый быстрый, поскольку он не хранит данных, а только имеет
> текущую строку. А фетч одной строки достаточно быстрая операция.


Хотел было попробовать однонаправленый курсор:
CursorType:=ctOpenForwardOnly;
LockType:=ltReadOnly;

но когда хочу поставить серверный курсор, то мой код не хочет работать.
Может потому что используются методы TAdoDataset:
eof
next
recordcount
Fields[0].DataSize

??
Но пока не знаю. Буду разбираться...
Хотя уже скорость меня и так  устраивает...


 
Desdechado ©   (2006-09-08 12:44) [17]

RecordCount точно тут не нужен, т.к. до извлечения последней записи их число не известно.



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

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

Наверх




Память: 0.51 MB
Время: 0.056 c
9-1138054239
Аццкий_рыцарь:)
2006-01-24 01:10
2006.11.05
TBackGroundSprite В DelphiX...


2-1161111936
DROWSY
2006-10-17 23:05
2006.11.05
Ретро вопрос. :)


15-1160656122
Slava812
2006-10-12 16:28
2006.11.05
Вкладка безопасность


15-1160983963
Sseerrgg
2006-10-16 11:32
2006.11.05
Оперативка


1-1159348453
Виталий Панасенко
2006-09-27 13:14
2006.11.05
Автоматизация Excel