![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отображение прогресса при UPDATE базы [D6]
leonidus © (2008-05-30 16:33:00)Юзаю Access-базу через ADO. Делаю UPDATE большой базы, и на некоторых слабеньких машинах он длится по 10-15 секунд в течении которого программа подвисает и юзер нервничает не понимая что происходит. Подскажите пожалуйста как в ходе обновления показывать прогресс работы или хотябы периодически иметь возможность вызвать application.ProcessMessages?
stas (2008-05-31 20:56:00) [21]leonidus (31.05.08 18:50) [14]
Я писал про Update, а ві делаете Select.
leonidus (2008-05-31 18:50:00) [22]Анатолий, простите не понял вас... если вы о явном присвоении:
AdoDataSet1.ExecuteOptions:=[eoAsyncExecute];
то я пробовал и в обжект инспекторе выставлять eoAsyncExecute, все равно подвисает программа...
Anatoly Podgoretsky (2008-05-31 18:10:00) [23]> leonidus (31.05.2008 15:29:12) [12]
Разве это команда, что бы ее
исполнять?
leonidus (2008-05-31 15:29:00) [24]>Stas, если делаю так:
AdoDataSet1.ExecuteOptions:=[eoAsyncExecute];
ADODataSet1.Close;
ADODataSet1.CommandText:='SELECT * FROM tab ORDER BY tab.header';
ADODataSet1.Open;
то при выполнении этого блока программа подвисает
sniknik (2008-05-31 10:41:00) [25]> Может. Но я всё равно сомневаюсь, что
>> длится по 10-15 секунд
> именно из-за чего-то приведённого в [5].
ну да, даже 7 запросов на 1000 записей не тянут на 15 сек... но это не повод чтобы писать 7 вместо одного.
и да скорее всего чтото там еще есть, только раз оно не показано значит необсуждаемо. потом, если всплывет, можно будет еще про индексы поговорить, про нормализацию (условие у него смотрю по строке, т.е. там куча повторяющихся значений строк, нормализация прямотаки напрашивается). и о нужности этих запросов вообще... (значения присваиваются странные, 0, ''... это начальная инициализация записи?... про дефаултные значения для полей автор похоже не знает... но опять таки что делается, и зачем не сказано, есть только вопрос о оптимизации запросов)
> Могу себе представить, если объём оперативки не соответствует требованиям ОС. Плюс загружено много процессов.
ага, а если к машине привязать собаку, и ехать соответственно так чтобы она успевала, или мерить скорость на участках с пробками... то можно говорить что машины ужасно медленные, практически на лошади обогнать можно... и нафига они тогда нужны?
Германн (2008-05-31 02:04:00) [26]
> sniknik © (30.05.08 19:53) [4]
>
> > и на некоторых слабеньких машинах он длится по 10-15 секунд
> машина - 286й пень?
> не могу другую представить, чтобы один UPDATE на ограниченной
> по размеру базе делался аж целых 15 секунд...
>
Могу себе представить, если объём оперативки не соответствует требованиям ОС. Плюс загружено много процессов.
Германн (2008-05-31 02:01:00) [27]
> > может она больше всего времени занимает?
> проверь. выполни без него...
>
Может. Но я всё равно сомневаюсь, что
> длится по 10-15 секунд
именно из-за чего-то приведённого в [5].
sniknik (2008-05-30 23:33:00) [28]> может можно как-то оптимизировать запросы?
конечно... ведь это на самом деле один запрос разбитый зачемто на 7.
и еще немного времени можно выиграть используя ADOCommand вместо ADOQuery, совсем чуть чуть, но... Close в нем нет, и это хорошо, видя как ты его используеш.
> может она больше всего времени занимает?
проверь. выполни без него...
Правильный_Вася (2008-05-30 22:55:00) [29]
> ADOQuery1.ExecSQL; ADOQuery1.Close;
в чем сакральный смысл выделенного?
> может она больше всего времени занимает?
вероятно, если каждый из апдейтов изменяет только одну запись (что вряд ли, судя по условию <>
leonidus (2008-05-30 22:52:00) [30]хотя потом делаю еще и выборку:
ADODataSet1.Close;
ADODataSet1.CommandText:='SELECT * FROM tab ORDER BY tab.header';
ADODataSet1.Open;
может она больше всего времени занимает?
leonidus (2008-05-30 22:13:00) [31]UPDATE не один, у меня их 7, база - 1000 записей:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE tab SET tab.status=:Str1'+ ' WHERE tab.header<>:Str2');
ADOQuery1.Parameters.ParamByName('Str1').Value:='';
ADOQuery1.Parameters.ParamByName('Str2').Value:='';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE tab SET tab.active_word=:Str3'+ ' WHERE tab.header<>:Str4');
flag:=false;
ADOQuery1.Parameters.ParamByName('Str3').Value:=flag;
ADOQuery1.Parameters.ParamByName('Str4').Value:='';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE tab SET tab.associaciya_true=:Str1'+ ' WHERE tab.header<>:Str2');
ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
ADOQuery1.Parameters.ParamByName('Str2').Value:='';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE tab SET tab.vibor_perevoda_true=:Str1'+ ' WHERE tab.header<>:Str2');
ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
ADOQuery1.Parameters.ParamByName('Str2').Value:='';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE tab SET tab.mozaika_true=:Str1'+ ' WHERE tab.header<>:Str2');
ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
ADOQuery1.Parameters.ParamByName('Str2').Value:='';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE tab SET tab.vspomnit_true=:Str1'+ ' WHERE tab.header<>:Str2');
ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
ADOQuery1.Parameters.ParamByName('Str2').Value:='';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE tab SET tab.perevod_true=:Str1'+ ' WHERE tab.header<>:Str2');
ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
ADOQuery1.Parameters.ParamByName('Str2').Value:='';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
может можно как-то оптимизировать запросы?
sniknik (2008-05-30 19:53:00) [32]> и на некоторых слабеньких машинах он длится по 10-15 секунд
машина - 286й пень?
не могу другую представить, чтобы один UPDATE на ограниченной по размеру базе делался аж целых 15 секунд...
Stas (2008-05-30 16:43:00) [33]AdoDataSet.ExecuteOptions:=[eoAsyncExecute]
leonidus (2008-05-30 16:40:00) [34]Stas, встречный вопрос, а как выполнить запрос асинхронно?
Stas (2008-05-30 16:39:00) [35]Асинхронное выполнение запроса, выполнит его в отдельном потоке, программа подвисать небудет, а прогресс отобразить неполучится.