TADOQuery::Next слишком медленно
Необходимо пробежаться по ним с помощью TADOQuery::Next()
ADOQuery1->Next();
при этом время составляет почти 5 мин (без всяких вычислений)
при чем, первый 10-15% проходит довольно шустро, затем замедляется, а после 50-60% вообще ползет еле-еле... (смотрел по прогрессбару)
какие параметры могут ускорить?
ЗЫ: пробовал TADOQuery::CacheSize = 100 000; ощутимого результата не дало.
ЗЫЗЫ: В дотнете тоже самое проходит за 10 сек.
Необходимо пробежаться по ним с помощью TADOQuery::Next()
ADOQuery1->Next();
Возможно уменьшить столь нехилый объем данных? Например разбить этот запрос на постраничный возврат данных. А еще ADO и ADO.NET совсем разные по внутренней организации.
Оно у меня визуально вообще не выводится, и вся задача в том что бы именно пробежать этит объем за наименьшее врямя. А вообще планируется несколько млн. записей.
при чем, первый 10-15% проходит довольно шустро, затем замедляется, а после 50-60% вообще ползет еле-еле... (смотрел по прогрессбару)
1) А без прогрессбара пробовал?
2) Я с ADOQuery не работал. Тонкостей не знаю.
Но с TQuery приходилось :). Перед вычислениями в цикле я отключал
реакцию на визуалные компоненты. Ты пишешь, что их нет (я так понимаю - грида)
но может программное "отключение" проигнорирует вызов каких-то методов ....
и это поможет
TBookmark bm = ADOQuery->GetBookmark(); ADOQuery->First();
...
ADOQuery->GotoBookmark(bm); ADOQuery->FreeBookmark(bm);
while ( ADOQuery->ControlsDisabled() ) ADOQuery->EnableControls();
что с ним, что без него разницы почти нет (1-2 сек. это не разница)
2) Я с ADOQuery не работал. Тонкостей не знаю.
Но с TQuery приходилось :). Перед вычислениями в цикле я отключал
реакцию на визуалные компоненты. Ты пишешь, что их нет (я так понимаю - грида)
но может программное "отключение" проигнорирует вызов каких-то методов ....
он ни к чему не привязан...
видимо и правда ADO - отстой для таких задач... придется делать на сервере, в т.ч. и большую математику.
Или в дотнет переводить (что само по себе не сложно)
ЗЫ: Как дотнет в математике (тригонометрия, матрицы и т.п), посравнению с C++ ?
Я, например, работал с BDE ( Paradox ) и AidAim ( Accuracer DB ). Разница в скорости очень ощутима!
А ещё, как-то столкнулся с проблемой прогрессбара, только не стандартного
а TCGauge. Доставил он мне хлопот. Он, оказывается, очень медленно перерисовывается, особенно, если инициализируешь MAX границу, и без разницы, новым или тем же значением.
а что толку то? если у меня 80% сервер считает, а в парадокс запихивать это и есть парадокс :)
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, как в остальныя версиях не знаю):
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 сек.