![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неравномерность скорости выборки из базы...
SergP. © (2006-09-07 17:38:00)
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 записей...
мне нужно выполнить запрос, потом один раз "пробежаться" по датасету и уничтожить его... Может для такого случая есть какое-то решение, которое даст большую скорость?
Desdechado (2006-09-08 12:44:00) [1]RecordCount точно тут не нужен, т.к. до извлечения последней записи их число не известно.
SergP. (2006-09-08 12:39:00) [2]> [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 11:35:00) [3]sniknik © (08.09.06 09:12) [9]
> однонаправленный курсор для скорости не поможет, быстрее всего
> "пробежка" по локальному уже выкачанному на клиента рекордсету
Может, это в ADO так. Но в dbExpress однонаправленный курсор самый быстрый, поскольку он не хранит данных, а только имеет текущую строку. А фетч одной строки достаточно быстрая операция.
SergP. (2006-09-08 11:33:00) [4]> [13] sniknik © (08.09.06 11:25)
> > Обращение в RecNo есть... Неужели из-за него может тормозить?
>
> опять таки, попробуй...
Я его уже успел убрать и заменить инкрементирущейся в цикле переменной... Но для эксперимента снова попробовал.
Действительно включились тормоза...
Всем огромное спасибо!!!
sniknik (2006-09-08 11:25:00) [5]> Обращение в RecNo есть... Неужели из-за него может тормозить?
опять таки, попробуй...
> А теперь рассказать можно почему так?
в код загляни. а в общем, избегаются лишние проверки, проверка той же связи контролов с рекордсетом.
SergP. (2006-09-08 10:33:00) [6]> >> Ещё перед началом и в конце я бы DisableControls и EnableControls
> поставил.
> абсолютно справедливое и полезное замечание
> > Это зачем?
> попробуй и узнаеш
Блин... А действительно помогло...
> [1] Ega23 © (07.09.06 17:43)
Шаман, однако...
А теперь рассказать можно почему так?
А то я в поисковиках искал, нашел во такое:
*DisableControls* запрещает обновления состояния контролам, связанным с датасетом и увеличивает счетчик вызовов на 1. Если датасет выступает в роли мастера, то обновления запрещаются и для связанного датасета.
Но у меня нет контролов связаных с датасетом...
SergP (2006-09-08 09:58:00) [7]> ну вот чем он, этот список, лучше стал от того что его передали
> с стринг лист?)
Тем чтио мне нужно ве потом сохранить в файл в формате:
значение поля (единственного) + #13#10
и так далее.
SergP (2006-09-08 09:50:00) [8]> а именно, если там например есть обращение к RecNo, то его
> надо убрать. (ну может быть еще чтото неожиданное)
Обращение в RecNo есть... Неужели из-за него может тормозить?
Ладно. Поставлю тогда счетчик
sniknik (2006-09-08 09:12:00) [9]>> Ещё перед началом и в конце я бы DisableControls и EnableControls поставил.
абсолютно справедливое и полезное замечание
> Это зачем?
попробуй и узнаеш
однонаправленный курсор для скорости не поможет, быстрее всего "пробежка" по локальному уже выкачанному на клиента рекордсету (даже учитывая, т.е. + время выкачивания). проверялось не раз.
> вариант уже предложили - [1]
хороший вариант, тормоза на перераспределении памяти от все больше и больше растущего размера строки убирает, но... ;) есть вариант еще лучше - ничего никуда не передавать, работать со списком строк рекордсете/рекордсетом (ну вот чем он, этот список, лучше стал от того что его передали с стринг лист?)
ну и еще возможные тормоза в "волшебных" пузырьках.. н... то есть точках
здесь
begin
fieldline:=Fields[0].AsString+#13#10;
...
Next;
end;
а именно, если там например есть обращение к RecNo, то его надо убрать. (ну может быть еще чтото неожиданное)
Slym(RO) (2006-09-08 07:07:00) [10]Повторюсь... пред пост покоцался
я так понял нужно составить 1 строку из значений таблицы?
самое тормознутое это фрагментация памяти при конкатенации строк-
fieldline:=fieldline Fields[0].AsString #13#10;
вариант уже предложили - [1]
ANB © (07.09.06 18:21) [6]
кэширивания ранее прочитанных записей
с чего вдруг? только при нехватки памяти... автор не упомянул что у него P1 133/16
~Slymius (2006-09-08 06:19:00) [11]я так понял нужно составить 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
ANB (2006-09-07 18:21:00) [12]Имхо - тормоза начинаются из-за кэширования ранее прочитанных записей. Значит - однозначно однонаправленный курсор и лучше серверный.
Desdechado (2006-09-07 18:14:00) [13]ADO не использую, не знаю, какие там однонаправленные.
Поищи в справке unidirectional dataset
SergP. (2006-09-07 18:03:00) [14]> > А на WIN98 данные влезли бы в TStringList, если там общий
>
> > размер в несколько Мб?
> Ограничения на длину строки - 2 Гб, на кол-во строк в листе
> - 2 с гаком миллиарда. Хватит?
Разве на WIN98 ограничение не в 64 кб?
> Используй однонаправленный датасет, а не кэширующий.
Че-нить почитать про однонаправленные датасеты не посоветуете?
Или может примерчик приведете?
Desdechado (2006-09-07 17:58:00) [15]> А на WIN98 данные влезли бы в TStringList, если там общий
> размер в несколько Мб?
Ограничения на длину строки - 2 Гб, на кол-во строк в листе - 2 с гаком миллиарда. Хватит?
> мне нужно выполнить запрос, потом один раз "пробежаться"
> по датасету и уничтожить его..
Используй однонаправленный датасет, а не кэширующий.
SergP. (2006-09-07 17:50:00) [16]> Я бы заменил fieldline:string; на fieldline:TStringList;
>
> и в цикле
> fieldline.Add(Fields[0].AsString)
А на WIN98 данные влезли бы в TStringList, если там общий размер в несколько Мб?
> Ещё перед началом и в конце я бы DisableControls и EnableControls
> поставил.
Это зачем?
Ega23 (2006-09-07 17:43:00) [17]Я бы заменил fieldline:string; на fieldline:TStringList;
и в цикле
fieldline.Add(Fields[0].AsString)
Ещё перед началом и в конце я бы DisableControls и EnableControls поставил.