Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TADOQuery::Next слишком медленно

11
21 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
TADOQuery возвращает ~200 тыс. записей.
Необходимо пробежаться по ним с помощью TADOQuery::Next()
 
Код:
while (!ADOQuery1->Eof)
        ADOQuery1->Next();


при этом время составляет почти 5 мин (без всяких вычислений)

при чем, первый 10-15% проходит довольно шустро, затем замедляется, а после 50-60% вообще ползет еле-еле... (смотрел по прогрессбару)

какие параметры могут ускорить?

ЗЫ: пробовал TADOQuery::CacheSize = 100 000; ощутимого результата не дало.
ЗЫЗЫ: В дотнете тоже самое проходит за 10 сек.
5
21 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: oxotnik333
TADOQuery возвращает ~200 тыс. записей.
Необходимо пробежаться по ним с помощью TADOQuery::Next()
 
Код:
while (!ADOQuery1->Eof)
        ADOQuery1->Next();
при этом время составляет почти 5 мин (без всяких вычислений)

Возможно уменьшить столь нехилый объем данных? Например разбить этот запрос на постраничный возврат данных. А еще ADO и ADO.NET совсем разные по внутренней организации.

11
21 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase
Возможно уменьшить столь нехилый объем данных? Например разбить этот запрос на постраничный возврат данных. А еще ADO и ADO.NET совсем разные по внутренней организации.



Оно у меня визуально вообще не выводится, и вся задача в том что бы именно пробежать этит объем за наименьшее врямя. А вообще планируется несколько млн. записей.

3.2K
21 июля 2008 года
nikipelovav
152 / / 12.04.2006
Цитата: oxotnik333

при чем, первый 10-15% проходит довольно шустро, затем замедляется, а после 50-60% вообще ползет еле-еле... (смотрел по прогрессбару)



1) А без прогрессбара пробовал?

2) Я с ADOQuery не работал. Тонкостей не знаю.
Но с TQuery приходилось :). Перед вычислениями в цикле я отключал
реакцию на визуалные компоненты. Ты пишешь, что их нет (я так понимаю - грида)
но может программное "отключение" проигнорирует вызов каких-то методов ....
и это поможет

 
Код:
while ( !ADOQuery->ControlsDisabled() ) ADOQuery->DisableControls();
    TBookmark bm = ADOQuery->GetBookmark(); ADOQuery->First();

    ...

    ADOQuery->GotoBookmark(bm); ADOQuery->FreeBookmark(bm);
    while ( ADOQuery->ControlsDisabled() ) ADOQuery->EnableControls();
11
21 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: nikipelovav
1) А без прогрессбара пробовал?


что с ним, что без него разницы почти нет (1-2 сек. это не разница)

Цитата: nikipelovav

2) Я с ADOQuery не работал. Тонкостей не знаю.
Но с TQuery приходилось :). Перед вычислениями в цикле я отключал
реакцию на визуалные компоненты. Ты пишешь, что их нет (я так понимаю - грида)
но может программное "отключение" проигнорирует вызов каких-то методов ....


он ни к чему не привязан...

5
21 июля 2008 года
hardcase
4.5K / / 09.08.2005
Предположение о том, что ADO сам по себе никуда не годится не катит?
3.2K
21 июля 2008 года
nikipelovav
152 / / 12.04.2006
Попробуй тотже объём данных открыть в TQuery используя, например, Paradox таблицы. И посмотри на длительность "пробега". Сразу станет ясно "ху из ху" :)
11
21 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase
Предположение о том, что ADO сам по себе никуда не годится не катит?


видимо и правда ADO - отстой для таких задач... придется делать на сервере, в т.ч. и большую математику.
Или в дотнет переводить (что само по себе не сложно)
ЗЫ: Как дотнет в математике (тригонометрия, матрицы и т.п), посравнению с C++ ?

3.2K
21 июля 2008 года
nikipelovav
152 / / 12.04.2006
Цитата: nikipelovav
Попробуй тотже объём данных открыть в TQuery используя, например, Paradox таблицы. И посмотри на длительность "пробега". Сразу станет ясно "ху из ху" :)



Я, например, работал с BDE ( Paradox ) и AidAim ( Accuracer DB ). Разница в скорости очень ощутима!
А ещё, как-то столкнулся с проблемой прогрессбара, только не стандартного
а TCGauge. Доставил он мне хлопот. Он, оказывается, очень медленно перерисовывается, особенно, если инициализируешь MAX границу, и без разницы, новым или тем же значением.

11
21 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: nikipelovav
Попробуй тотже объём данных открыть в TQuery используя, например, Paradox таблицы. И посмотри на длительность "пробега". Сразу станет ясно "ху из ху" :)



а что толку то? если у меня 80% сервер считает, а в парадокс запихивать это и есть парадокс :)

5
21 июля 2008 года
hardcase
4.5K / / 09.08.2005
[FONT=Courier New]Информация к размышлению.[/FONT] [FONT=Courier New]На РСДНе.[/FONT]
11
22 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Проблемма решается след. образом:
Код:
ADOQuery1->Open();
    ProgressBar1->Max = ADOQuery1->RecordCount;
    DWORD start = GetTickCount();
    ADOQuery1->ControlsDisabled();
    while (!ADOQuery1->Recordset->Eof)
    {
        ProgressBar1->Position++;
        Application->ProcessMessages();
        ADOQuery1->Recordset->MoveNext();
    }
    this->Caption = (GetTickCount() - start)/1000;

так же в проект надо включить файл syssupp.cpp из папки Borland\Source\Vcl и в нем подправить (для BCB 6, как в остальныя версиях не знаю):
Код:
#pragma argsused
        void __fastcall CheckSafecallResult(HRESULT hr)
    {
        asm
        {
            //extrn    @System@@CheckAutoResult$qqrv:near - так в Borland
            //call    @System@@CheckAutoResult$qqrv      - так в Borland
            extrn    @System@@CheckAutoResult$qqrl:near  // так должно быть
            call    @System@@CheckAutoResult$qqrl       // так должно быть
        }
    }


Итого, на все ~200 тыс. записей ушло ~7 сек.
14
22 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Ну вот.. Еще один глюк ADOшной обертки от борланд :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог