Страница 1 из 1

Проблема с большим объемом данных

Добавлено: 11 апр 2006, 06:02
mshp
Уважаемые господа!
Возникла проблема при работе с большим количество записей в таблице (около 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'));
Запускаю из менеджера - машина просто вешается без всяких сообщений.

Подскажите, люди добрые, где глюк?

Добавлено: 11 апр 2006, 08:18
Dimitry Sibiryakov
В ДНК.
Раз уж полез в ХП, пиши так:

Код: Выделить всё

FOR SELECT errs.recid_mcod FROM errs WHERE errs.f='S' INTO :aaa DO
  DELETE FROM PATU WHERE PATU.recid_mcod = :aaa;

Re: Проблема с большим объемом данных

Добавлено: 11 апр 2006, 23:05
smu
mshp писал(а):Уважаемые господа!
Возникла проблема при работе с большим количество записей в таблице (около 500000)!

1. Отбираю запросом (компоненты Delphi TIBQuery и
TIBUpdateSQL) примерно 45000 записей и пытаюсь их удалить простым удалением каждой записи. В результате, на команде ApplyUpdates получаю ошибку IB клиента "User abort".

...Подскажите, люди добрые, где глюк?
Зачем кешировать (ApplyUpdates)? Если хотите удалить 45000 записей и используете нечто вроде IBQuery.Delete, то вначале
1. Делаете DisableControls
2. Цикл по записям с выполнением IBQuery.Delete
3. Commit для текущей транзакции или Rollback (если использовать блок try..except..end), отрываете новую транзакцию.
4. Открываете IBQuery, EnableControls

Шаги 1-4 стандартные, во многих книгах приводятся с небольшими дополнениями. Главное, чтобы после каждого удаления не выполнять

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