| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PostgreSQL > out of memory |
| Автор: yuliada 6.5.2009, 09:35 | ||
При каскадном удалении больших объемов данных возникает ошибка:
Как можно эту проблему решить? |
| Автор: pompei 6.5.2009, 10:08 |
| много раз удалить понемногу |
| Автор: yuliada 6.5.2009, 10:40 | ||
Т.е. что-то вроде этого много раз?
В принципе этот вариант работать будет. Какие-то еще могут быть способы или это единственный вариант? |
| Автор: yuliada 6.5.2009, 10:57 |
| Хотя нет, если есть только одна запись в таблице, которую нужно удалить, но на нее очень много всего ссылается, то вариант с limit не сработает. |
| Автор: sir_nuf_nuf 6.5.2009, 11:44 | ||
если просто нужно очстить таблицу - то подойдет
странно почему при удалении тратится память. Может версионность или тригеры какие-то работают ? |
| Автор: yuliada 6.5.2009, 12:05 |
| В базе хранятся данные из разных источников информации, для них есть отдельная табличка datasource. Нужно удалить все данные, принадлежащие какому-либо источнику информации, т.е. строчку в таблице datasource, при удалении которой каскадно теоретически должно удаляться все, что на нее ссылалось. Практически когда много данных оно падает. Тригеров нету, версионности вроде тоже. Там много связанных табличек, у которых для FOREIGN KEY CONSTRAINT стоит ON DELETE CASCADE. |
| Автор: yuliada 7.5.2009, 01:43 |
| Если удалять записи по частям в одной транзакции, то все равно после нескольких раз оно упадет. Не хотелось бы это все на части разделять... |
| Автор: pompei 7.5.2009, 07:12 |
| Нужно писать скрипт на перле(например) который рекурсивно удаляет понемногу снизу - это тупой и достаточно быстрый вариант, хотя не исключены и другие... И да - транзакции необходимо очень часто комитить, иначе всё будет работать скопом, как и раньше. |
| Автор: yuliada 7.5.2009, 08:42 |
| А как примерно будет работать этот скрипт? Он будет как-то читать структуру базы, понимать где в данным момент находится "низ", выгребать несколько записей "снизу" (на которые ничего не ссылается как я поняла) и удалять их? Или такую штуку нельзя реализовать, как-то по другому надо? Если понемногу выбирать данные "снизу", то это наверно будет много раз длинный такой join через кучу таблиц, медленно не будет? |
| Автор: pompei 8.5.2009, 10:45 | ||||||
Да. Примерно так... главное чтобы везде индексы цеплялись. Ну а по поводу медленности - с большими данными всегда медленно работать. И ни надо ни какие inner join-ы, все просто, например: есть таблицы:
вызываем deleteFrom_A_byId( id ненужной записи ), где (в псевдокоде):
deleteFrom_C_byId - можно усложнить чтобы удалять из d не скопом все, а порциями с последующими коммитами |
| Автор: yuliada 9.5.2009, 11:48 |
| Так писать наверно не хорошо, т.к. для каждой таблички нужна своя процедура удаления, а в базе их много. Т.е. желательно в этом случае как-то читать структуру базы и гененрить соответствующие sql-ки для удаления данных. Как вариант в голову пока приходит с JDBC что-то при помощи DatabaseMetaData попробовать сделать. А вообще попроще нет решения этой проблемы? Средствами самой бд нельзя обойтись (может там что-то настроить хитро надо)? |
| Автор: pompei 12.5.2009, 06:36 | ||||||
Какая разница как делать, главное решить проблемму!!! Ну бопустим в БД около 50 связанных таблиц - для наприсание скрипта к такой БД понадобиться 1 день (максимум 2 дня), а вы уже с 6-ого мая здесь висите (6 дней муму чешите).
Это надо для написания какого-то универсального скрипта - вам универсальный скрипт нужен, или удалить эти блин данные?
По поводу этого вопроса даже сами разработчики в затылках начнут часать, иначебы уже давно избавились от такой ошибки - если подобная ошибка возникает, то бороться с ней безполезно - только обойти. |
| Автор: yuliada 14.5.2009, 07:37 |
| Что-то простое чтобы эти данные удалить уже давно изобразили. Обойдемся этим решением, если других пока нет. |