![]() |
|
Модераторы: LSD |
![]()
|
|
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
При каскадном удалении больших объемов данных возникает ошибка:
Как можно эту проблему решить? |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
много раз удалить понемногу
Это сообщение отредактировал(а) pompei - 6.5.2009, 10:10 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Т.е. что-то вроде этого много раз?
В принципе этот вариант работать будет. Какие-то еще могут быть способы или это единственный вариант? Это сообщение отредактировал(а) yuliada - 6.5.2009, 10:47 |
|||
|
||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Хотя нет, если есть только одна запись в таблице, которую нужно удалить, но на нее очень много всего ссылается, то вариант с limit не сработает.
|
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
если просто нужно очстить таблицу - то подойдет
странно почему при удалении тратится память. Может версионность или тригеры какие-то работают ? |
|||
|
||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
В базе хранятся данные из разных источников информации, для них есть отдельная табличка datasource. Нужно удалить все данные, принадлежащие какому-либо источнику информации, т.е. строчку в таблице datasource, при удалении которой каскадно теоретически должно удаляться все, что на нее ссылалось. Практически когда много данных оно падает. Тригеров нету, версионности вроде тоже. Там много связанных табличек, у которых для FOREIGN KEY CONSTRAINT стоит ON DELETE CASCADE.
|
|||
|
||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Если удалять записи по частям в одной транзакции, то все равно после нескольких раз оно упадет. Не хотелось бы это все на части разделять...
|
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Нужно писать скрипт на перле(например) который рекурсивно удаляет понемногу снизу - это тупой и достаточно быстрый вариант, хотя не исключены и другие...
И да - транзакции необходимо очень часто комитить, иначе всё будет работать скопом, как и раньше. Это сообщение отредактировал(а) pompei - 7.5.2009, 07:14 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
А как примерно будет работать этот скрипт? Он будет как-то читать структуру базы, понимать где в данным момент находится "низ", выгребать несколько записей "снизу" (на которые ничего не ссылается как я поняла) и удалять их? Или такую штуку нельзя реализовать, как-то по другому надо? Если понемногу выбирать данные "снизу", то это наверно будет много раз длинный такой join через кучу таблиц, медленно не будет?
|
|||
|
||||
| pompei |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Да. Примерно так... главное чтобы везде индексы цеплялись. Ну а по поводу медленности - с большими данными всегда медленно работать. И ни надо ни какие inner join-ы, все просто, например: есть таблицы:
вызываем deleteFrom_A_byId( id ненужной записи ), где (в псевдокоде):
deleteFrom_C_byId - можно усложнить чтобы удалять из d не скопом все, а порциями с последующими коммитами Это сообщение отредактировал(а) pompei - 8.5.2009, 11:13 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
||||||
|
|||||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Так писать наверно не хорошо, т.к. для каждой таблички нужна своя процедура удаления, а в базе их много. Т.е. желательно в этом случае как-то читать структуру базы и гененрить соответствующие sql-ки для удаления данных. Как вариант в голову пока приходит с JDBC что-то при помощи DatabaseMetaData попробовать сделать. А вообще попроще нет решения этой проблемы? Средствами самой бд нельзя обойтись (может там что-то настроить хитро надо)?
|
|||
|
||||
| pompei |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Какая разница как делать, главное решить проблемму!!! Ну бопустим в БД около 50 связанных таблиц - для наприсание скрипта к такой БД понадобиться 1 день (максимум 2 дня), а вы уже с 6-ого мая здесь висите (6 дней муму чешите).
Это надо для написания какого-то универсального скрипта - вам универсальный скрипт нужен, или удалить эти блин данные?
По поводу этого вопроса даже сами разработчики в затылках начнут часать, иначебы уже давно избавились от такой ошибки - если подобная ошибка возникает, то бороться с ней безполезно - только обойти. Это сообщение отредактировал(а) pompei - 12.5.2009, 06:46 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
||||||
|
|||||||
| yuliada |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 16.2.2009 Где: Иркутск - San Die go Репутация: нет Всего: нет |
Что-то простое чтобы эти данные удалить уже давно изобразили. Обойдемся этим решением, если других пока нет.
Это сообщение отредактировал(а) yuliada - 5.6.2009, 11:18 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PostgreSQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |