|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Есть таблица, в которой хранится примерно 6М строк. Код: plsql 1. 2. 3. 4. 5. 6. 7.
Таблица минимально связана с БД, в ней есть один FK (account_id). БД используется периодической процедурой на одном сервере (то есть конкурентного доступа к ней быть не должно), процедура читает записи с moment>:date, а затем делает update set review=sysdate для обработанных записей (построчно). Обработанные записи более нигде не используются. Сейчас я хочу их удалить, это примерно 5М строк. delete from flags where moment < date'2019-01-01' выполняется уже почти 10 минут. С данной таблицей уже просто дождусь окончания удаления, но кроме нее у меня есть еще пара подобных таблиц, в которых суммарно под 20М записей. Как лучше всего удалять большие объемы записей в подобных случаях? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2019, 15:08 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
CTAS +права+индексы+ограничения c последующими drop+rename Insert select в partitioned таблицу идентичной структуры c последующим exchange partition если зачищаемая таблица не секционирована, иначе в посекционно в несекционированную c обратным обменом ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2019, 15:15 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Вариация первого варианта: CTAS + truncate исходной + обратный insert select ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2019, 15:17 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
andrey_anonymous CTAS +права+индексы+ограничения c последующими drop+rename Слишком брутально для меня, лучше подожду лишний десяток минут. andrey_anonymous Вариация первого варианта: CTAS + truncate исходной + обратный insert select Это выглядит более понятно. Но наверное на время последнего шага процедура на сервере работать не будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2019, 15:34 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Alibek B. на время последнего шага процедура на сервере работать не будет? Так Вам еще и в online? Тогда dbms_redefinition. Ну и если подобные развлечения планируются в будущем, то рассмотрите жизненный цикл данных и предусмотрите решение - хотя бы partitioned table ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2019, 15:38 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
andrey_anonymous CTAS +права+индексы+ограничения c последующими drop+rename ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2019, 15:52 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
1. Создаём индекс по полю, по которому будет отсечка. 2. Формируем коллекцию rowid строк, подлежащих удалению. 3. forall ...delete. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 17:45 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Synoptic 1. Создаём индекс по полю, по которому будет отсечка. 2. Формируем коллекцию rowid строк, подлежащих удалению. 3. forall ...delete. Доп. расходы (просканировать таблицу, создать индекс, просканировать индекс, сложить 100500 rowid в коллекцию, потратить ресурсы на обновление индекса при удалении из таблицы) вижу. На чем предполагаете выигрыш? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 17:48 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Если нужно удалить намного больше строк чем оставить, то может оказаться проще всего: 1. Создать пустую копию таблицы со всеми ключами-индексами и т.п. 2. Insert /*+ append parallel(16) */ into table_2 as select * from table_1 то что нужно оставить. 3. Сделать rename новой таблицы на старую, ну и имена индексов-ключей поменять. Время недоступности для чтения минимально. Но если в нее параллельно пишут - этот способ не подойдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2019, 20:35 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
andrey_anonymous Synoptic 1. Создаём индекс по полю, по которому будет отсечка. 2. Формируем коллекцию rowid строк, подлежащих удалению. 3. forall ...delete. Доп. расходы (просканировать таблицу, создать индекс, просканировать индекс, сложить 100500 rowid в коллекцию, потратить ресурсы на обновление индекса при удалении из таблицы) вижу. На чем предполагаете выигрыш? Плюс не развалятся пакеты при drop/rename таблиц, которые их используют. Плюс таблицы полностью доступны, т.е. это online-операция. Ну и кроме того, получим нормальный PL/SQL скрипт, без всякого DDL внутри. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2019, 06:37 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Synoptic 1. Создаём индекс по полю, по которому будет отсечка. 2. Формируем коллекцию rowid строк, подлежащих удалению. 3. forall ...delete. Нужно будет подумать. Индекс по полю moment уже есть. Но вот с пунктом 2 мне кажется неоднозначно. Нужно ведь куда-то сложить 5 миллионов rowid? Если в память, то не скажется ли это негативно на сервере? Если во временную таблицу, то не получится шило на мыло? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2019, 12:05 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
я так понимаю Synoptic имел ввиду удаление небольшими (сравнительно) порциями ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2019, 13:50 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Alibek B. Нужно ведь куда-то сложить 5 миллионов rowid? Если в память, то не скажется ли это негативно на сервере? Если во временную таблицу, то не получится шило на мыло? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2019, 15:15 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Alibek B., Alibek B. Synoptic 1. Создаём индекс по полю, по которому будет отсечка. 2. Формируем коллекцию rowid строк, подлежащих удалению. 3. forall ...delete. Нужно будет подумать. Индекс по полю moment уже есть. Но вот с пунктом 2 мне кажется неоднозначно. Нужно ведь куда-то сложить 5 миллионов rowid? Если в память, то не скажется ли это негативно на сервере? Если во временную таблицу, то не получится шило на мыло? Железо, на котором работает база - 2Тб ОЗУ, 128 процессорных ядер. Делать же подмену таблиц на проде...даже не знаю, жесть какая-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2019, 20:13 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Alibek B. таблиц, в которых суммарно под 20М записей. Synoptic таблиц, с количеством записей исчисляемых миллиардами. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2019, 12:52 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Synoptic Железо, на котором работает база - 2Тб ОЗУ, 128 процессорных ядер. У меня 4 ядра и 4ГБ ОЗУ. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2019, 13:27 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Alibek B. Synoptic Железо, на котором работает база - 2Тб ОЗУ, 128 процессорных ядер. У меня 4 ядра и 4ГБ ОЗУ. авторdelete from flags where moment < date'2019-01-01' выполняется уже почти 10 минут. удаляйте по старинке, и не заморавчивайте себе голову 10 +/- минут (для миллионов строк ето фигня) зы я удалял порциями в цикле прімерно по 100 000 (and rownum<100000) + коммит (порции подобрал емперически) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 11:15 |
|
Удалить много строк из одиночной таблицы
|
|||
---|---|---|---|
#18+
Да, я так и понял. Правда в моем случае разбивать на порции можно не через rownum, а напрямую с использованием поля moment, т.к. оно все равно индексирован. То есть Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2019, 12:23 |
|
|
start [/forum/topic.php?fid=52&msg=39887405&tid=1881884]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 146ms |
0 / 0 |