Oracle Опции архива и очистки - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь выяснить, как лучше всего выполнить архивацию и очистку с учетом нашей ситуации.

У нас есть примерно 50 миллионов записей в таблице A. Мы хотим архивировать данные в целевую таблицу , а затем удалить эти данные в исходной таблице . Мы хотели бы сохранить базу данных по нескольким критериям, которые пересекаются друг с другом. Например, мы хотим сохранить данные за последние 5 месяцев в дополнение к сохранению всех записей, например, с помощью Indicator = 'True'. Indicator = 'True', вероятно, вернет записи после 5 месяцев. Это означает, что я должен использовать условие ИЛИ для сбора данных. Исходя из условий, нам необходимо сохранить 10 миллионов записей и архивировать / очистить 40 миллионов записей . Мне нужно было бы создать процесс, который будет запускаться каждые 6 месяцев.

Мой вопрос заключается в том, каковы наиболее эффективные варианты для меня, чтобы сделать это как для архивирования, так и для очистки ? PROC / массовое удаление / вставка будет моим лучшим вариантом?

Раздел , кажется, не может быть и речи, так как есть несколько условий, которые накладываются друг на друга.

1 Ответ

2 голосов
/ 11 февраля 2020

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

Пример

Строки с KEEP_ID='N' должны быть удалены через 5 месяцев.

CREATE TABLE tab
  ( id            NUMBER(38,0),
    trans_dt      DATE,
    keep_id       VARCHAR2(1)
  )
 PARTITION BY RANGE (trans_dt) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
 SUBPARTITION BY LIST (keep_id)
   SUBPARTITION TEMPLATE
   ( SUBPARTITION p_catalog VALUES ('Y'),
     SUBPARTITION p_internet VALUES ('N')
   )
 (PARTITION p_init VALUES LESS THAN (TO_DATE('01-JAN-2019','dd-MON-yyyy'))
  );

Заполнить выборочными данными за 6 месяцев

insert into tab (id, trans_dt, keep_id)
select rownum, add_months(date'2019-08-01', trunc((rownum-1) / 2)), decode(mod(rownum,2),0,'Y','N') 
from dual connect by level <= 12;

select * from tab
order by trans_dt, keep_id; 

        ID TRANS_DT            KEEP_ID
---------- ------------------- -------
         1 01.08.2019 00:00:00 N       --- this subpartition should be deleted
         2 01.08.2019 00:00:00 Y       
         3 01.09.2019 00:00:00 N       
         4 01.09.2019 00:00:00 Y       
         5 01.10.2019 00:00:00 N       
         6 01.10.2019 00:00:00 Y       
         7 01.11.2019 00:00:00 N       
         8 01.11.2019 00:00:00 Y       
         9 01.12.2019 00:00:00 N       
        10 01.12.2019 00:00:00 Y       
        11 01.01.2020 00:00:00 N       
        12 01.01.2020 00:00:00 Y 

Теперь используйте расширенные имена разделов для ссылки на подраздел, который должен быть удален.

Удаление подраздела старше 5 месяцев, но только для KEEP_ID = 'N'

 alter table tab drop subpartition for (DATE'2019-08-01','N');   

Новые данные

        ID TRANS_DT            KEEP_ID
---------- ------------------- -------
         2 01.08.2019 00:00:00 Y       
         3 01.09.2019 00:00:00 N       
         4 01.09.2019 00:00:00 Y   
.....
...