powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Удалить много строк из одиночной таблицы
18 сообщений из 18, страница 1 из 1
Удалить много строк из одиночной таблицы
    #39886256
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица, в которой хранится примерно 6М строк.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create table flags (
  flag_id number not null,
  account_id number not null,
  status varchar2 not null,
  moment datetime not null,
  review datetime
)


Таблица минимально связана с БД, в ней есть один FK (account_id).
БД используется периодической процедурой на одном сервере (то есть конкурентного доступа к ней быть не должно), процедура читает записи с moment>:date, а затем делает update set review=sysdate для обработанных записей (построчно). Обработанные записи более нигде не используются. Сейчас я хочу их удалить, это примерно 5М строк.
delete from flags where moment < date'2019-01-01' выполняется уже почти 10 минут.
С данной таблицей уже просто дождусь окончания удаления, но кроме нее у меня есть еще пара подобных таблиц, в которых суммарно под 20М записей.
Как лучше всего удалять большие объемы записей в подобных случаях?
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886260
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAS +права+индексы+ограничения c последующими drop+rename
Insert select в partitioned таблицу идентичной структуры c последующим exchange partition если зачищаемая таблица не секционирована, иначе в посекционно в несекционированную c обратным обменом
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886261
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариация первого варианта: CTAS + truncate исходной + обратный insert select
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886270
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
CTAS +права+индексы+ограничения c последующими drop+rename

Слишком брутально для меня, лучше подожду лишний десяток минут.

andrey_anonymous
Вариация первого варианта: CTAS + truncate исходной + обратный insert select

Это выглядит более понятно.
Но наверное на время последнего шага процедура на сервере работать не будет?
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886272
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
на время последнего шага процедура на сервере работать не будет?

Так Вам еще и в online?
Тогда dbms_redefinition.
Ну и если подобные развлечения планируются в будущем, то рассмотрите жизненный цикл данных и предусмотрите решение - хотя бы partitioned table
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886287
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
CTAS +права+индексы+ограничения c последующими drop+rename
ATMIR/ui
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886903
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Создаём индекс по полю, по которому будет отсечка.
2. Формируем коллекцию rowid строк, подлежащих удалению.
3. forall ...delete.
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886904
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synoptic
1. Создаём индекс по полю, по которому будет отсечка.
2. Формируем коллекцию rowid строк, подлежащих удалению.
3. forall ...delete.

Доп. расходы (просканировать таблицу, создать индекс, просканировать индекс, сложить 100500 rowid в коллекцию, потратить ресурсы на обновление индекса при удалении из таблицы) вижу.
На чем предполагаете выигрыш?
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886944
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно удалить намного больше строк чем оставить, то может оказаться проще всего:

1. Создать пустую копию таблицы со всеми ключами-индексами и т.п.
2. Insert /*+ append parallel(16) */ into table_2 as select * from table_1 то что нужно оставить.
3. Сделать rename новой таблицы на старую, ну и имена индексов-ключей поменять.

Время недоступности для чтения минимально. Но если в нее параллельно пишут - этот способ не подойдет.
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39886996
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Synoptic
1. Создаём индекс по полю, по которому будет отсечка.
2. Формируем коллекцию rowid строк, подлежащих удалению.
3. forall ...delete.

Доп. расходы (просканировать таблицу, создать индекс, просканировать индекс, сложить 100500 rowid в коллекцию, потратить ресурсы на обновление индекса при удалении из таблицы) вижу.
На чем предполагаете выигрыш?
Индекс создаём один раз (или это разовая задача?)
Плюс не развалятся пакеты при drop/rename таблиц, которые их используют.
Плюс таблицы полностью доступны, т.е. это online-операция.
Ну и кроме того, получим нормальный PL/SQL скрипт, без всякого DDL внутри.
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887017
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synoptic
1. Создаём индекс по полю, по которому будет отсечка.
2. Формируем коллекцию rowid строк, подлежащих удалению.
3. forall ...delete.

Нужно будет подумать.
Индекс по полю moment уже есть.
Но вот с пунктом 2 мне кажется неоднозначно.
Нужно ведь куда-то сложить 5 миллионов rowid? Если в память, то не скажется ли это негативно на сервере? Если во временную таблицу, то не получится шило на мыло?
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887030
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я так понимаю Synoptic имел ввиду удаление небольшими (сравнительно) порциями
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887048
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Нужно ведь куда-то сложить 5 миллионов rowid? Если в память, то не скажется ли это негативно на сервере? Если во временную таблицу, то не получится шило на мыло?
А ты пробуй. Не зря ж говорят, что если тебя @бут, то ты крепчаешь. Со временем, хотя за лет 10 это уже должно было произойти, научишься думать своей головой и не реагировать на всяких выскочек.
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887121
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,


Alibek B.
Synoptic
1. Создаём индекс по полю, по которому будет отсечка.
2. Формируем коллекцию rowid строк, подлежащих удалению.
3. forall ...delete.

Нужно будет подумать.
Индекс по полю moment уже есть.
Но вот с пунктом 2 мне кажется неоднозначно.
Нужно ведь куда-то сложить 5 миллионов rowid? Если в память, то не скажется ли это негативно на сервере? Если во временную таблицу, то не получится шило на мыло?
Не далее как на текущей неделе удалял порядка 10 Млн записей из высоконагруженных таблиц, с количеством записей исчисляемых миллиардами. Ничего не просело, и таблицы всё это время были доступны.
Железо, на котором работает база - 2Тб ОЗУ, 128 процессорных ядер.
Делать же подмену таблиц на проде...даже не знаю, жесть какая-то.
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887165
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
таблиц, в которых суммарно под 20М записей.
Synoptic
таблиц, с количеством записей исчисляемых миллиардами.
Ну раз с миллиардами не просело, решение очевидно - добить количество строк до беспроблемного.
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887171
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synoptic
Железо, на котором работает база - 2Тб ОЗУ, 128 процессорных ядер.

У меня 4 ядра и 4ГБ ОЗУ.
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887360
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Synoptic
Железо, на котором работает база - 2Тб ОЗУ, 128 процессорных ядер.

У меня 4 ядра и 4ГБ ОЗУ.


авторdelete from flags where moment < date'2019-01-01' выполняется уже почти 10 минут.


удаляйте по старинке, и не заморавчивайте себе голову
10 +/- минут (для миллионов строк ето фигня)

зы
я удалял порциями в цикле прімерно по 100 000 (and rownum<100000) + коммит (порции подобрал емперически)

.....
stax
...
Рейтинг: 0 / 0
Удалить много строк из одиночной таблицы
    #39887405
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я так и понял.
Правда в моем случае разбивать на порции можно не через rownum, а напрямую с использованием поля moment, т.к. оно все равно индексирован.
То есть
Код: plsql
1.
2.
3.
4.
5.
delete from flags where moment < date'2015-01-01';
delete from flags where moment < date'2016-01-01';
delete from flags where moment < date'2017-01-01';
delete from flags where moment < date'2018-01-01';
delete from flags where moment < date'2019-01-01';
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Удалить много строк из одиночной таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]