Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2007, 17:24   #1
Lunatikus
Пользователь
 
Регистрация: 29.06.2007
Сообщений: 13
По умолчанию оптимизация изменения данных

Вот общий вид проблемной части кода:
var
ost:double;
begin
while not ADOQuery.eof do
begin
ADOQuery.edit;
ost:="блабла и прочие вычисления"
ADOQuery.fields[1].asfloat=ost;
ADOQuery.next;
end;
end;

Изза кол-ва строк в запросе порядка 500 тысяч данная весч выполняется ОЧЕНЬ долго...что я делаю неправильно и как оптимизировать изменение данных в таблице?Возможная замена ADOQuery на ADOTable но получается тоже самое.Помогите,ветераны программирования БД!Спасибо за уделенное время.

Ах да,база на Access 2002

Последний раз редактировалось Lunatikus; 29.06.2007 в 17:28.
Lunatikus вне форума Ответить с цитированием
Старый 30.06.2007, 22:19   #2
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

какая база используется?
И почему ты считаешь , что долго обрабатывается? напиши сколько по времени?
Если клиент-сервер используется, то я б посоветовал использовать не query и Table, а процедуры.... Если же нет, то query... Table тут не нужно... 500 тыс выводить через Table - это извращение
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 02.07.2007, 12:50   #3
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Lunatikus Посмотреть сообщение
Вот общий вид проблемной части кода:
Изза кол-ва строк в запросе порядка 500 тысяч данная весч выполняется ОЧЕНЬ долго...что я делаю неправильно и как оптимизировать изменение данных в таблице?Возможная замена ADOQuery на ADOTable но получается тоже самое.Помогите,ветераны программирования БД!Спасибо за уделенное время.

Ах да,база на Access 2002
Я не ветеран. Я только учусь. Поэтому мои советы достаточно примитивны:

Попробуй при запросе SELECT наложить как можно больше ограниченичений на обрабатываемую БД при помощи предложения WHERE. Это позволит существенно сократить количество обрабатываемых в запросе данных и, следовательно, время, затрачиваемое на их обработку.

Рискну предположить, что выражение "блабла и прочие вычисления" и подразумевает отбор необходимых для обработки записей плюс сами вычисления. Тебе приходится шерстить всю БД от корки до корки в то время как фактическое количество изменяемых записей может исчисляться от единиц до нескольких десятков.

И почему ты не используешь для обновления данных SQL запрос с оператором UPDATE? Синтаксис:

UPDATE имя_таблицы
SET столбец_1 = выражение_1, столбец_2 = выражение_2,
..., столбец_n = выражение_n
[WHERE предикаты];

IMHO: Он выполнит обновление данных непосредственно в БД, не затрачивая времени на изменение данных в ее виртуальной копии, именуемой набор данных ADOQuery, как происходит в твоем случае.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 03.07.2007, 09:18   #4
Lunatikus
Пользователь
 
Регистрация: 29.06.2007
Сообщений: 13
По умолчанию

to Pitbull:
по времени около двух часов-неприемлимо.Что за процедуры?Да,будет клиент-сервер.То,что извращение,уже понял =)

to Andrei:
я не могу накладывать ограничения-мне надо проверять все строки.Чтобы было понятнее,опишу еще более подробно:

Есть таблица DEAL в которой есть все поля из данного запроса. Однако сам он формируется из других таблиц.Мне надо его результаты обработать:
ost:=ost-ADOQuery.fields[1]+ADOQuery.fields[2]+ADOQuery.fields[3];
ADOQuery.fields[4]=ost;
после чего сохраняю эти данные в DEAL и сдвигаюсь вниз в ADOQuery и в DEAL(таблицы различаются только тем,что в DEAL нет запросных и расчетных данных,а по ключу и кол-ву строк все совпадает).Соответственно приходится одновременно работать с запросом на 500тыщ строк и таблицей на теже 500 тыщ строк =(
Как тут вставить апдейт я не представляю,мне же надо сдвигаться по строкам.И что,делать еще один ADOQuery,которому с каждым сдвигом менять параметры?
Lunatikus вне форума Ответить с цитированием
Старый 03.07.2007, 10:15   #5
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Lunatikus Посмотреть сообщение
to Pitbull:
по времени около двух часов-неприемлимо.Что за процедуры?Да,будет клиент-сервер.То,что извращение,уже понял =)

to Andrei:
я не могу накладывать ограничения-мне надо проверять все строки.Чтобы было понятнее,опишу еще более подробно:

Есть таблица DEAL в которой есть все поля из данного запроса. Однако сам он формируется из других таблиц.Мне надо его результаты обработать:
ost:=ost-ADOQuery.fields[1]+ADOQuery.fields[2]+ADOQuery.fields[3];
ADOQuery.fields[4]=ost;
после чего сохраняю эти данные в DEAL и сдвигаюсь вниз в ADOQuery и в DEAL(таблицы различаются только тем,что в DEAL нет запросных и расчетных данных,а по ключу и кол-ву строк все совпадает).Соответственно приходится одновременно работать с запросом на 500тыщ строк и таблицей на теже 500 тыщ строк =(
Как тут вставить апдейт я не представляю,мне же надо сдвигаться по строкам.И что,делать еще один ADOQuery,которому с каждым сдвигом менять параметры?
И что? Между двумя просмотрами этих таблиц изменились все эти 500 тыщ записей? Хмм... Верится с трудом. Задумайся как выделить изменившиеся записи. Их и обрабатывай.

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

PS: При выполнении таких глобальных изменениях в таблицах, какие проделываешь ты, необходимо задействовать механизм танзакций. Представь, что что-то случится во время работы твой программы... Это черевато потерей всех данных.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.

Последний раз редактировалось Andrei; 03.07.2007 в 10:17.
Andrei вне форума Ответить с цитированием
Старый 03.07.2007, 11:12   #6
Lunatikus
Пользователь
 
Регистрация: 29.06.2007
Сообщений: 13
По умолчанию

ну сейчас вопрос не о работе с клиентом,а о начальной обработке всех 500 тысяч строк.Дальше при изменении данных у клиента я так и сделаю,накладывая ограничения,буду работать именно с изменившимися строками.Мне сейчас важнее сократить начальную обработку данных и создание базы для следующих изменений.Так что ни первый, ни второй варианты не подходят.Собсно,с чего все началось,я подумал что комбинация: ADOQ.edit;ADOQ.next;т.е. установка в режим редактирования,потом сдвиг,снова режим редактирования и так далее, может быть заменена чем то более рациональным.Например установить edit в начале всего цикла и не включать снова после каждого сдвига,а в конце все сохранить.Увы,я не знаю как это сделать-я новичек
Lunatikus вне форума Ответить с цитированием
Старый 03.07.2007, 11:47   #7
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Lunatikus Посмотреть сообщение
ну сейчас вопрос не о работе с клиентом,а о начальной обработке всех 500 тысяч строк...
Тут я тебе не помощник. Лопатить такого монстра всегда занимает прорву времени, какой бы ты вариант не избрал. Придется набраться терпения и подождать результатов. Единственное, что утешает - это, как правило, разовая операция.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как отследить изменения в базе данных unit-85 Помощь студентам 2 13.08.2008 11:29
Оптимизация кода. MAKTECYMA Общие вопросы C/C++ 2 05.06.2008 16:48
Оптимизация WEB SirJay Свободное общение 0 09.05.2008 00:26
Оптимизация Terran Общие вопросы Delphi 3 03.05.2008 19:03