Текущий архив: 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.49 MB
Время: 0.049 c