Уважаемые господа!
Возникла проблема при работе с большим количество записей в таблице (около 500000)!
1. Отбираю запросом (компоненты Delphi TIBQuery и
TIBUpdateSQL) примерно 45000 записей и пытаюсь их удалить простым удалением каждой записи. В результате, на команде ApplyUpdates получаю ошибку IB клиента "User abort".
2.Создаю хранимую процедуру
delete from PATU
WHERE PATU.CD_ZAP IN
(select PATU.CD_ZAP
from Patu, errs
where (PATU.recid_mcod=errs.recid_mcod) and
(errs.f='S'));
Запускаю из менеджера - машина просто вешается без всяких сообщений.
Подскажите, люди добрые, где глюк?
Проблема с большим объемом данных
Модератор: kdv
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
В ДНК.
Раз уж полез в ХП, пиши так:
Раз уж полез в ХП, пиши так:
Код: Выделить всё
FOR SELECT errs.recid_mcod FROM errs WHERE errs.f='S' INTO :aaa DO
DELETE FROM PATU WHERE PATU.recid_mcod = :aaa;
Re: Проблема с большим объемом данных
Зачем кешировать (ApplyUpdates)? Если хотите удалить 45000 записей и используете нечто вроде IBQuery.Delete, то вначалеmshp писал(а):Уважаемые господа!
Возникла проблема при работе с большим количество записей в таблице (около 500000)!
1. Отбираю запросом (компоненты Delphi TIBQuery и
TIBUpdateSQL) примерно 45000 записей и пытаюсь их удалить простым удалением каждой записи. В результате, на команде ApplyUpdates получаю ошибку IB клиента "User abort".
...Подскажите, люди добрые, где глюк?
1. Делаете DisableControls
2. Цикл по записям с выполнением IBQuery.Delete
3. Commit для текущей транзакции или Rollback (если использовать блок try..except..end), отрываете новую транзакцию.
4. Открываете IBQuery, EnableControls
Шаги 1-4 стандартные, во многих книгах приводятся с небольшими дополнениями. Главное, чтобы после каждого удаления не выполнять
Если удаляете всего несколько записей и хотите сразу видеть изменения, то читайте местный FAQ по ibx компонентам,там все подробно и понятно расписано.