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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.042 c
2-1161578461
X_ksandr_X
2006-10-23 08:41
2006.11.05
Корректное завершение программ


15-1161064558
palva
2006-10-17 09:55
2006.11.05
Еще раз про пончик


2-1161362732
kulkse
2006-10-20 20:45
2006.11.05
Ошибка при запуске программы.


2-1161329602
stalcker666
2006-10-20 11:33
2006.11.05
Telnet


8-1131126689
Dozer
2005-11-04 20:51
2006.11.05
Алгоритм сжатия звука AMR





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский