Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Удалить много строк из одиночной таблицы / 18 сообщений из 18, страница 1 из 1
07.11.2019, 15:08
    #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
07.11.2019, 15:15
    #39886260
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удалить много строк из одиночной таблицы
CTAS +права+индексы+ограничения c последующими drop+rename
Insert select в partitioned таблицу идентичной структуры c последующим exchange partition если зачищаемая таблица не секционирована, иначе в посекционно в несекционированную c обратным обменом
...
Рейтинг: 0 / 0
07.11.2019, 15:17
    #39886261
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удалить много строк из одиночной таблицы
Вариация первого варианта: CTAS + truncate исходной + обратный insert select
...
Рейтинг: 0 / 0
07.11.2019, 15:34
    #39886270
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удалить много строк из одиночной таблицы
andrey_anonymous
CTAS +права+индексы+ограничения c последующими drop+rename

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

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

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

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

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

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

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

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

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


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

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

У меня 4 ядра и 4ГБ ОЗУ.
...
Рейтинг: 0 / 0
11.11.2019, 11:15
    #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
11.11.2019, 12:23
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Удалить много строк из одиночной таблицы / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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