![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление большого количества записей firebird 1.5 [D6, firebird]
Dim!S © (2009-10-28 08:43:00)Уважаемые форумчане!
Есть бд на Firebird 1.5 (gdb). Необходимо из неё удалить каждые несколько записей...
вот кусок кода, но иногда программа выдаёт сообщение out of memory
...
IBTable1.DisableControls;
cnt_Rec := 0;
IBTable1.First;
with IBTable1 do
while not(EOF) do
begin
IBTable1.First;
Delete;
Delete;
Delete;
Delete;
Next;
Inc(cnt_Rec);
Application.ProcessMessages;
if cnt_Rec >= 10000 then
begin
ShowMessage(IntToStr(RecNo) + ' - ' + IntToStr(cnt_Rec));
cnt_Rec := 0;
IBTransaction1.Commit;
IBTransaction1.StartTransaction;
end;
end;
IBTransaction1.Commit;
IBTable1.EnableControls;
Label2.Caption := TimeToStr(Time);
IBTable1.Refresh;
...
Как лучше написать код для указанной задачи? Записей в таблице может быть миллион. К базе никто не подключен... Может лучше через IBQuery ии есть более изящный способ?
P.S. с firebird дело не имел вообще, только с paradox
Большое спасибо.
Dim!S (2009-10-30 17:09:00) [1]проверю ОБЯЗАТЕЛЬНО, неподнимаемый бэкап - это куча седых волос и ... ;)
Вариант с копированием очень трудоемкий (по крайней мере, для меня сейчас), не смогу отследить все триггеры и связи - времени не хватит, да и не стоит оно того (в данном случае) - гораздо проще удалить ненужное... или не связываться вообще...
Anatoly Podgoretsky (2009-10-30 16:59:00) [2]Продумай вариант с копирование.
Sergey13 (2009-10-30 16:59:00) [3]> [76] Dim!S (30.10.09 16:57)
> но бэкапов наделал с помощью gbak ;)
Проверял бекапы то? А то неподнимаемый бекап - это посильнее безхозных записей будет. 8-)
Anatoly Podgoretsky (2009-10-30 16:57:00) [4]Если делать не удаление, а копирование в две базы с учетом бизнес логики, то задача имеет решение, но не всегда бизнес логика доступна или понятно, но по крайней мере это путь без последствий.
Dim!S (2009-10-30 16:57:00) [5]Да уж.. записи без связей это тот ещё мусор... и ГЛЮКИ!
Запрос под нужные критерии доработал, условия усложнил, добавил дополнительные критерии... :) Вроде работает, буду тестировать тщательно
Запрос на удаление сотен тысяч записей работает очень шустро..., конечно доп условия замедлили, но IBTable просто помирал на более простом условии...
P.S. база не очень сложная по структуре... несколько лет назад разработана... вроде косяков по ключам нет, но бэкапов наделал с помощью gbak ;)
Sergey13 (2009-10-30 16:53:00) [6]> [73] Anatoly Podgoretsky © (30.10.09 16:37)
Это если есть "умозрительные" FK поддерживаемые из клиента. Да, безхозные записи - штука та еще.
Anatoly Podgoretsky (2009-10-30 16:37:00) [7]> Sergey13 (30.10.2009 16:31:11) [71]
> иначе отвалится запрос с ошибкой.
Хуже, останутся потеряные записи без связей - жуткое дело.
Anatoly Podgoretsky (2009-10-30 16:35:00) [8]> Sergey13 (30.10.2009 16:31:11) [71]
> но жутко мощная - можно одним запросом всю БД грохнуть.
Надо только ключевой точке ударить, например по OrganisationID с настроеным каскадом.
Sergey13 (2009-10-30 16:31:00) [9]> [69] Dim!S (30.10.09 15:52)
Нет там никакого скелета. Есть свойство внешнего ключа - каскадное удаление. Штука простая но жутко мощная - можно одним запросом всю БД грохнуть. Только надо очень внимательно изучить (и осознать) структуру таблици настроить все внешние ключи связанных таблиц на каскад, иначе отвалится запрос с ошибкой.
> [70] Anatoly Podgoretsky © (30.10.09 16:18)
Как по мне - я бы вообще ничего не удалял. Мне бы без разницы - ну есть клиент в справочнике, ну есть у него проводки за ПРОШЛЫЕ времена - это никому вроде как не мешает.
Anatoly Podgoretsky (2009-10-30 16:18:00) [10]> Sergey13 (30.10.2009 15:45:08) [68]
Это если база построена правильно и есть признак свой/чужой (ну это исправимо), но вот что они будут делать, если клиент будет относиться к обеим фирмам и разделить проводки будет непросто.
Dim!S (2009-10-30 15:52:00) [11]Это идея, но, боюсь, пока сложновато будет разобраться в этом... Если кинете скелет или поподробнее объясните, то займусь этим вариантом...
Sergey13 (2009-10-30 15:45:00) [12]> [66] Dim!S (30.10.09 15:28)
> Фирма разделилась, клиенты тоже поделились, хозяева хотят
> разделить базу и оставить в "своей" базе проводки только
> по "своим" клиентам...
Настроить (возможно временно, потом отключить) каскадное удаление по внешним ключам и удалить "не своих" клиентов. Просто в справочнике клиентов. Без всякого дополнительного программирования.
Dim!S (2009-10-30 15:30:00) [13]Забыл...
>sniknik Большое спасибо...
Думаю "плотненько" заняться FireBird. Пора переходить к клиент-серверным платформам :)
P.S. - программирование - не основной мой вид деятельности, но очень интересно...
Dim!S (2009-10-30 15:28:00) [14]Условия выборки для удаления прояснились :)
Меня сначала ввели в заблуждение... На самом деле так:
Фирма разделилась, клиенты тоже поделились, хозяева хотят разделить базу и оставить в "своей" базе проводки только по "своим" клиентам...
Извините, за ввод в заблуждение...
P.S. "Все так говорят." - ну так я не утверждаю что я "белый и пушистый", но пусть в меня кинет камень Честый Человек. Только барон Мюнхгаунзен тоже был честным человеком ;). А с реально мутными делами я не связываюсь... - дороже выйдет...
sniknik (2009-10-30 13:18:00) [15]> помогите почистить торговую базу :)
а почему нет? я неоднократно чистил торговые базы... мне их специально присылали. вполне нормальное занятие, если чистить от мусора, или старый период, или... любой критерий заказчика, но не "каждую пятую" при том что порядка нет, это глупо, а вот от дублей, хотя это почти как "каждую вторую" нормально (а если дублей 5 то еще более похоже но не одно и тоже).
sniknik (2009-10-30 13:12:00) [16]> что непонятно?
> удалить надо из таблицы T1 записи по определённому условию. НЕ каждую n-ю!
"определённому условию" непонятно.
> Необходимо из TOrder удалить записи конкретного магазина и конкретного клиента. Как сделать это чере запрос не знаю.
а вот это уже конкретное условие... (похоже на Х)
DELETE FROM TOrders WHERE ShopID = (SELECT ID FROM TShops WHERE Name = "конкретный магазин") AND ClientID = (SELECT ID FROM TClients WHERE Name = "конкретный клиент")
Anatoly Podgoretsky (2009-10-30 12:32:00) [17]> Dim!S (30.10.2009 11:08:01) [61]
> И не связываюсь с "мутными" способами заработка...
Все так говорят.
Sergey13 (2009-10-30 11:20:00) [18]> [61] Dim!S (30.10.09 11:08)
> но! почему вы опираетесь на мой пример
А на что опираться? Только на свой телепатор. Больше не на что. Ты же молчишь как партизан.
Зачем вообще тебе нужно удалять записи из и так небольшой таблицы? Тем более по так и не сформулированному тобой условию. Место на диске экономить что ли? Так места на диске после просто удаления записей не прибавится.
Dim!S (2009-10-30 11:08:00) [19]>Sergey13
Я знаю на что может потянуть прореживание заказов ;)
но! почему вы опираетесь на мой пример :) право? смешно... :) кто Вам сказал что будет прореживаться БД торговли или иной сферы?
Я не настолько наивен чтобы лезть в инет с просьбой: помогите почистить торговую базу :) И не связываюсь с "мутными" способами заработка...
Уважаемые форумчане!
Давайте по существу вопроса, пожалуйста...
Sergey13 (2009-10-30 08:53:00) [20]> [58] Dim!S (30.10.09 08:18)
Судя по названиям таблиц ты пишешь какой то DB-вирус или иную вредилку. "Прореживать" таблицу заказов - это знаете ли на статью со ссылкой может потянуть. Причем далеко не интернетовские.