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

Вниз

Отображение прогресса при UPDATE базы   Найти похожие ветки 

 
leonidus   (2008-05-30 16:33) [0]

Юзаю Access-базу через ADO. Делаю UPDATE большой базы, и на некоторых слабеньких машинах он длится по 10-15 секунд в течении которого программа подвисает и юзер нервничает не понимая что происходит. Подскажите пожалуйста как в ходе обновления показывать прогресс работы или хотябы периодически иметь возможность вызвать application.ProcessMessages?


 
Stas ©   (2008-05-30 16:39) [1]

Асинхронное выполнение запроса, выполнит его в отдельном потоке, программа подвисать небудет, а прогресс отобразить неполучится.


 
leonidus   (2008-05-30 16:40) [2]

Stas, встречный вопрос, а как выполнить запрос асинхронно?


 
Stas ©   (2008-05-30 16:43) [3]

AdoDataSet.ExecuteOptions:=[eoAsyncExecute]


 
sniknik ©   (2008-05-30 19:53) [4]

> и на некоторых слабеньких машинах он длится по 10-15 секунд
машина - 286й пень?
не могу другую представить, чтобы один UPDATE на ограниченной по размеру базе делался аж целых 15 секунд...


 
leonidus   (2008-05-30 22:13) [5]

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;

может можно как-то оптимизировать запросы?


 
leonidus   (2008-05-30 22:52) [6]

хотя потом делаю еще и выборку:

 ADODataSet1.Close;
 ADODataSet1.CommandText:="SELECT * FROM tab ORDER BY tab.header";
 ADODataSet1.Open;

может она больше всего времени занимает?


 
Правильный_Вася   (2008-05-30 22:55) [7]


> ADOQuery1.ExecSQL;  ADOQuery1.Close;

в чем сакральный смысл выделенного?

> может она больше всего времени занимает?

вероятно, если каждый из апдейтов изменяет только одну запись (что вряд ли, судя по условию <>


 
sniknik ©   (2008-05-30 23:33) [8]

> может можно как-то оптимизировать запросы?
конечно... ведь это на самом деле один запрос разбитый зачемто на 7.

и еще немного времени можно выиграть используя ADOCommand вместо ADOQuery, совсем чуть чуть, но... Close в нем нет, и это хорошо, видя как ты его используеш.

> может она больше всего времени занимает?
проверь. выполни без него...


 
Германн ©   (2008-05-31 02:01) [9]


> > может она больше всего времени занимает?
> проверь. выполни без него...
>

Может. Но я всё равно сомневаюсь, что
> длится по 10-15 секунд

именно из-за чего-то приведённого в [5].


 
Германн ©   (2008-05-31 02:04) [10]


> sniknik ©   (30.05.08 19:53) [4]
>
> > и на некоторых слабеньких машинах он длится по 10-15 секунд
> машина - 286й пень?
> не могу другую представить, чтобы один UPDATE на ограниченной
> по размеру базе делался аж целых 15 секунд...
>

Могу себе представить, если объём оперативки не соответствует требованиям ОС. Плюс загружено много процессов.


 
sniknik ©   (2008-05-31 10:41) [11]

> Может. Но я всё равно сомневаюсь, что
>> длится по 10-15 секунд
> именно из-за чего-то приведённого в [5].
ну да, даже 7 запросов на 1000 записей не тянут на 15 сек...  но это не повод чтобы писать 7 вместо одного.
и да скорее всего чтото там еще есть, только раз оно не показано значит необсуждаемо. потом, если всплывет, можно будет еще про индексы поговорить, про нормализацию (условие у него смотрю по строке, т.е. там куча повторяющихся значений строк, нормализация прямотаки напрашивается). и о нужности  этих запросов вообще... (значения присваиваются странные, 0, ""... это начальная инициализация записи?... про дефаултные значения для полей автор похоже не знает... но опять таки что делается, и зачем не сказано, есть только вопрос о оптимизации запросов)

> Могу себе представить, если объём оперативки не соответствует требованиям ОС. Плюс загружено много процессов.
ага, а если к машине привязать собаку, и ехать соответственно так чтобы она успевала, или мерить скорость на участках с пробками... то можно говорить что машины ужасно медленные, практически на лошади обогнать можно... и нафига они тогда нужны?


 
leonidus   (2008-05-31 15:29) [12]

>Stas, если делаю так:

 AdoDataSet1.ExecuteOptions:=[eoAsyncExecute];
 ADODataSet1.Close;
 ADODataSet1.CommandText:="SELECT * FROM tab ORDER BY tab.header";
 ADODataSet1.Open;

то при выполнении этого блока программа подвисает


 
Anatoly Podgoretsky ©   (2008-05-31 18:10) [13]

> leonidus  (31.05.2008 15:29:12)  [12]

Разве это команда, что бы ее
исполнять?


 
leonidus   (2008-05-31 18:50) [14]

Анатолий, простите не понял вас... если вы о явном присвоении:
AdoDataSet1.ExecuteOptions:=[eoAsyncExecute];

то я пробовал и в обжект инспекторе выставлять eoAsyncExecute, все равно подвисает программа...


 
stas ©   (2008-05-31 20:56) [15]

leonidus   (31.05.08 18:50) [14]
Я писал про Update, а ві делаете Select.


 
leonidus   (2008-05-31 21:00) [16]

сейчас посмотрел, действительно UPDATE выполняется довольно быстно, а вот с SELECT проблемка... его асинхронно никак выполнить нельзя?


 
stas ©   (2008-05-31 21:01) [17]

Хотя можно и  селект выполнять, вы почитайте как работать с запросами, которые выполняются асинхронно.


 
stas ©   (2008-05-31 21:03) [18]

leonidus   (31.05.08 21:00) [16]
Update не выполняется быстрее, он продолжает выполнятся в фоновом режиме


 
Anatoly Podgoretsky ©   (2008-05-31 21:24) [19]


> Хотя можно и  селект выполнять, вы почитайте как работать
> с запросами, которые выполняются асинхронно.

Выполнять можно команды, а это выборка и поэтому написана ерунда, но врядли программа зависает, надо просто много ждать.


 
Anatoly Podgoretsky ©   (2008-05-31 21:27) [20]


> Анатолий, простите не понял вас...

Это конференция не для начинающих, надо обладать хотя бы начальными знаниями.


 
leonidus   (2008-05-31 22:38) [21]

Анатолий я вас очень уважаю, но все же хотел бы получить ответ на свой вопрос, а не простите, посылание на три буквы.


 
Anatoly Podgoretsky ©   (2008-05-31 22:51) [22]

Не та конференция, чтобы расписывать элементарщину, а ты сам очень высоко оценил свои знания, написав сюда, а не в начинающие.
Правда большинство твоих вопросов слишком простые и для той конференции. Так что читай справку там черным по белом написанов, всего то десяток строк. А если для тебя нет разницы между выборками и командами, так это знаешь кто виноват.


 
leonidus   (2008-06-01 01:57) [23]

Анатолий, причем тут выборки и команды, у меня вопрос в другом, мне нужно сделать так чтобы пока происходит выборка основной поток не подвисал. Прошу помочь мне в этом.


 
Германн ©   (2008-06-01 02:14) [24]


> leonidus   (01.06.08 01:57) [23]
>
> Анатолий, причем тут выборки и команды, у меня вопрос в
> другом, мне нужно сделать так чтобы пока происходит выборка
> основной поток не подвисал. Прошу помочь мне в этом.
>


> Отображение прогресса при UPDATE базы [D6]
>
> leonidus   (30.05.08 16:33)

Ты уж, Саид, определись, что тебе нужно.


 
leonidus   (2008-06-01 02:17) [25]

ну если прогресс сделать в принципе невозможно, то нужно хотябы исключить подвисание приложения.


 
Умищъ ©   (2008-06-01 02:47) [26]


> leonidus

А как у вас всё организовано?


 
Anatoly Podgoretsky ©   (2008-06-01 11:18) [27]

AdoDataSet1.ExecuteOptions:= подставить правильное значение, их то всего 4


 
sniknik ©   (2008-06-01 12:59) [28]

> ну если прогресс сделать в принципе невозможно
почему это невозможно? возможно, но это лишнее (это на 1000 записей то прогресс?... не смешите мои тапочки), с лишними действиями/ограничениями (если выполнение то не будет "конечной точки", нужно делать "плавающий" прогресс). и потом если делать то без асинхронности  не обойтись, ну или организации собственной в потоке, т.к. прогресс перерисовывается в основном потоке и синхронный запрос его же блокирует.
т.е. нужны начальные знания, а ты еще даже не определился что ты делаешь выборку или команду, асинхронно выполнение или фетчь.


 
Ум_ще   (2008-06-01 16:07) [29]


> leonidus   (30.05.08 16:33) 


Самое простое решение - выполнить последовательность запросов к БД в отдельном потоке. Соответственно, сможешь и ProgressBar организовать при этом.


 
Anatoly Podgoretsky ©   (2008-06-01 17:28) [30]

> Ум_ще  (01.06.2008 16:07:29)  [29]

АДО и так автоматически поддерживает выполнение в отдельном потоке с поддержкой прогресса.


 
Ум_ще   (2008-06-01 17:38) [31]


> Anatoly Podgoretsky ©   (01.06.08 17:28) [30]
> > Ум_ще  (01.06.2008 16:07:29)  [29]АДО и так автоматически
> поддерживает выполнение в отдельном потоке с поддержкой
> прогресса.


Это не значит, что нельзя или не нужно в доп. потоке сделать выполнение запроса.


 
Anatoly Podgoretsky ©   (2008-06-01 18:13) [32]

> Ум_ще  (01.06.2008 17:38:31)  [31]

Ему до потоков, как тебе до луны.


 
sniknik ©   (2008-06-01 18:14) [33]

> Это не значит, что нельзя или не нужно
можно то можно, но вот не нужно это факт.
и даже вредно, заморачиваться на этом игнорируя(/не разбираясь) реальную причину тормозов... можно конечно "глаза замазать" но смысл?

у меня простой синхронный запрос за 2.5 сек возвращает 373426 записей (машина тоже старая, не 286й конечно но...). 1000 практически не считается разница по времени (то 0 то 016 миллисекунд) надо на подсчет тиков переходить чтобы замерить... и на это прогресс бар?


 
Ум_ще-011   (2008-06-01 18:53) [34]


> можно то можно, но вот не нужно это факт.


Может быть.

>Автор

Проиндексируй в tab поле header.


 
Умище-011   (2008-06-01 18:55) [35]

Удалено модератором
Примечание: Offtopic



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.06 c
2-1212241497
9899100
2008-05-31 17:44
2008.06.29
ресурсы


15-1211177834
Mozart
2008-05-19 10:17
2008.06.29
Active Directory?


2-1212396147
Сергей
2008-06-02 12:42
2008.06.29
Как взять все записи четные пяти?


2-1212150966
Mozgan
2008-05-30 16:36
2008.06.29
Memo и SMTP


2-1212170295
Gjo
2008-05-30 21:58
2008.06.29
Закрытие консольных приложений





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