Лучший способ удалить миллионы строк в Oracle - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть таблица с 1 триллионом строк и 8 индексами, 2 внешними ключами и разделена столбцом, в котором хранится год. Для каждого человека я рассчитываю год (отдельный пакет), и данные за этот год должны быть удалены. В настоящее время последний раздел содержит 651 миллион строк, и мне нужно удалить около 6 миллионов строк из этого раздела. Ниже приведены вещи, которые я пробовал

  1. Удаление ванили - заняло много времени

  2. Массовая FORALL и DELETE - заняло много времени

  3. Обмен разделами - это самый быстрый, но все 8 индексов переходят в нерабочее состояние, и мне нужно восстановить все из них, что снова требует времени. В настоящее время раздел Exchange также не работает, так как в родительской таблице есть скрытые столбцы и выдается сообщение об ошибке, сообщающее

    ORA-12996: невозможно удалить виртуальный столбец, сгенерированный системой

В этой таблице 300 000 человек, и я рассчитал год для каждого человека, а теперь просматривая каждого человека и удаляя его, но фиксируя после удаления каждого человека.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете попробовать:

  1. Создание новой однораздельной таблицы
  2. Создание индексов для нее
  3. Использование вставки nologging с прямым путем (APPEND) для добавлениястроки, которые вы хотите сохранить.
  4. Выполнение обмена разделами
  5. Усечение однораздельной таблицы
  6. Повторите из (3) для других разделов
  7. Удаление без разбиениятаблица
  8. Резервное копирование

Обратите внимание, что индексы создаются во время вставки путем регистрации необходимых данных во временных сегментах, которые затем сканируются для построения индексов, а не полного сканированияСам стол.

0 голосов
/ 11 сентября 2018

Вы можете сделать что-то вроде этого:

create table tablewithrelevantdata unrecoverable as select * from tabletobedeleted where ....;
drop table tabletobedeleted;
rename tablewithrelevantdata to tabletobedeleted;
create index tabletobedeleted_idx1 on tabletobedeleted(c1,c2) unrecoverable parallel 5;

Поскольку у вас есть индексы, я дважды проверю, есть ли индексы в составных таблицах, например

  1. Студент
  2. Учитель
  3. Класс

Здесь Class имеет идентификатор ученика и учителя в качестве первичного ключа. Важны индексы StudentId и Teacherid в Class.

Также вы можете использовать delete как:

SET TRANSACTION USE ROLLBACK SEGMENT <test_segment>;
DELETE FROM tabletobedeleted WHERE <some_condition>
COMMIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...