Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> out of memory 
V
    Опции темы
yuliada
Дата 6.5.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



При каскадном удалении больших объемов данных возникает ошибка:
Код

ERROR: out of memory
SQL state: 53200
Detail: Failed on request of size 32.

Как можно эту проблему решить?

PM MAIL   Вверх
pompei
Дата 6.5.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



много раз удалить понемногу

Это сообщение отредактировал(а) pompei - 6.5.2009, 10:10
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
yuliada
Дата 6.5.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Т.е. что-то вроде этого много раз?
Код

delete FROM sometable where id in (select id from sometable where somecolumn=somecondition limit 100000)

В принципе этот вариант работать будет. Какие-то еще могут быть способы или это единственный вариант?

Это сообщение отредактировал(а) yuliada - 6.5.2009, 10:47
PM MAIL   Вверх
yuliada
Дата 6.5.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Хотя нет, если есть только одна запись в таблице, которую нужно удалить, но на нее очень много всего ссылается, то вариант с limit не сработает.
PM MAIL   Вверх
sir_nuf_nuf
Дата 6.5.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



если просто нужно очстить таблицу - то подойдет 
Код

truncate table A;


странно почему при удалении тратится память. Может версионность или тригеры какие-то работают ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
yuliada
Дата 6.5.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



В базе хранятся данные из разных источников информации, для них есть отдельная табличка datasource. Нужно удалить все данные, принадлежащие какому-либо источнику информации, т.е. строчку в таблице datasource, при удалении которой каскадно теоретически должно удаляться все, что на нее ссылалось. Практически когда много данных оно падает. Тригеров нету, версионности вроде тоже. Там много связанных табличек, у которых для FOREIGN KEY CONSTRAINT стоит ON DELETE CASCADE.
PM MAIL   Вверх
yuliada
Дата 7.5.2009, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Если удалять записи по частям в одной транзакции, то все равно после нескольких раз оно упадет. Не хотелось бы это все на части разделять...
PM MAIL   Вверх
pompei
Дата 7.5.2009, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Нужно писать скрипт на перле(например) который рекурсивно удаляет понемногу снизу - это тупой и достаточно быстрый вариант, хотя не исключены и другие...

И да - транзакции необходимо очень часто комитить, иначе всё будет работать скопом, как и раньше.

Это сообщение отредактировал(а) pompei - 7.5.2009, 07:14
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
yuliada
Дата 7.5.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



А как примерно будет работать этот скрипт? Он будет как-то читать структуру базы, понимать где в данным момент находится "низ", выгребать несколько записей "снизу" (на которые ничего не ссылается как я поняла) и удалять их? Или такую штуку нельзя реализовать, как-то по другому надо? Если понемногу выбирать данные "снизу", то это наверно будет много раз длинный такой join через кучу таблиц, медленно не будет?
PM MAIL   Вверх
pompei
Дата 8.5.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Цитата(yuliada @ 7.5.2009,  08:42)
А как примерно будет работать этот скрипт? Он будет как-то читать структуру базы, понимать где в данным момент находится "низ", выгребать несколько записей "снизу" (на которые ничего не ссылается как я поняла) и удалять их? Или такую штуку нельзя реализовать, как-то по другому надо? Если понемногу выбирать данные "снизу", то это наверно будет много раз длинный такой join через кучу таблиц, медленно не будет?

Да. Примерно так... главное чтобы везде индексы цеплялись.

Ну а по поводу медленности - с большими данными всегда медленно работать.

И ни надо ни какие inner join-ы, все просто, например:
есть таблицы:
Код

a(id, name)
b(id, name, a_id)
c(id, name, b_id)
d(id, name, c_id)


вызываем deleteFrom_A_byId( id ненужной записи ), где (в псевдокоде):
Код


function deleteFrom_A_byId( a_id )
    foreach row in ( select * from b where a_id = :a_id )
        deleteFrom_B_byId( row.id );
    end foreach
    delete from a where id = :a_id
    commit
end function

function deleteFrom_B_byId( b_id )
    foreach row in ( select * from c where b_id = :b_id )
        deleteFrom_C_byId( row.id );
    end foreach
    delete from b where id = :b_id
    commit
end function

function deleteFrom_C_byId( c_id )
    delete from d where c_id = :c_id
    delete from c where id = :c_id
    commit
end function



deleteFrom_C_byId - можно усложнить чтобы удалять из d не скопом все, а порциями с последующими коммитами

Это сообщение отредактировал(а) pompei - 8.5.2009, 11:13
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
yuliada
Дата 9.5.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Так писать наверно не хорошо, т.к. для каждой таблички нужна своя процедура удаления, а в базе их много. Т.е. желательно в этом случае как-то читать структуру базы и гененрить соответствующие sql-ки для удаления данных. Как вариант в голову пока приходит с JDBC что-то при помощи DatabaseMetaData попробовать сделать. А вообще попроще нет решения этой проблемы? Средствами самой бд нельзя обойтись (может там что-то настроить хитро надо)?
PM MAIL   Вверх
pompei
Дата 12.5.2009, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Цитата(yuliada @ 9.5.2009,  11:48)
Так писать наверно не хорошо, т.к. для каждой таблички нужна своя процедура удаления, а в базе их много. Т.е. желательно в этом случае как-то читать структуру базы и гененрить соответствующие sql-ки для удаления данных. 

Какая разница как делать, главное решить проблемму!!! Ну бопустим в БД около 50 связанных таблиц - для наприсание скрипта к такой БД понадобиться 1 день (максимум 2 дня), а вы уже с 6-ого мая здесь висите (6 дней муму чешите).

Цитата(yuliada @ 9.5.2009,  11:48)

Как вариант в голову пока приходит с JDBC что-то при помощи DatabaseMetaData попробовать сделать. 

Это надо для написания какого-то универсального скрипта - вам универсальный скрипт нужен, или удалить эти блин данные?
Цитата(yuliada @ 9.5.2009,  11:48)

А вообще попроще нет решения этой проблемы? Средствами самой бд нельзя обойтись (может там что-то настроить хитро надо)?

По поводу этого вопроса даже сами разработчики в затылках начнут часать, иначебы уже давно избавились от такой ошибки - если подобная ошибка возникает, то бороться с ней безполезно - только обойти.

Это сообщение отредактировал(а) pompei - 12.5.2009, 06:46
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
yuliada
Дата 14.5.2009, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 16.2.2009
Где: Иркутск - San Die go

Репутация: нет
Всего: нет



Что-то простое чтобы эти данные удалить уже давно изобразили. Обойдемся этим решением, если других пока нет.

Это сообщение отредактировал(а) yuliada - 5.6.2009, 11:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.