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

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
mshp
Сообщения: 7
Зарегистрирован: 11 апр 2006, 04:41

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

Сообщение mshp » 11 апр 2006, 06:02

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

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 11 апр 2006, 08:18

В ДНК.
Раз уж полез в ХП, пиши так:

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

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

smu
Сообщения: 39
Зарегистрирован: 29 окт 2005, 10:12

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

Сообщение smu » 11 апр 2006, 23:05

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 компонентам,там все подробно и понятно расписано.

Ответить