Как создать ежемесячный раздел в Oracle? - PullRequest
0 голосов
/ 06 октября 2018

У меня есть таблица с данными за 2017 и 2018 годы.Необходимо создать ежемесячный раздел для этой таблицы.

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

Когда я изменяю ошибку получения, как

ORA-14300: ключ разделения отображается на раздел за пределами максимально допустимого числаразделы

Мой сценарий

ALTER TABLE ORDERHDR_PART MODIFY 
PARTITION BY RANGE (LASTUPDATE) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
  (
   PARTITION ORDERHDR_PART_JAN VALUES less than (TO_DATE('01-02-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_FEB VALUES less than (TO_DATE('01-03-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_MAR VALUES less than (TO_DATE('01-04-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_APR VALUES less than (TO_DATE('01-05-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_MAY VALUES less than (TO_DATE('01-06-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_JUN VALUES less than (TO_DATE('01-07-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_JUL VALUES less than (TO_DATE('01-08-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_AUG VALUES less than (TO_DATE('01-09-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_SEP VALUES less than (TO_DATE('01-10-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_OCT VALUES less than (TO_DATE('01-11-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_NOV VALUES less than (TO_DATE('01-12-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_DEC VALUES less than (TO_DATE('01-01-2019','DD-MM-YYYY'))
   )ONLINE;

1 Ответ

0 голосов
/ 07 октября 2018

Я думаю, что ваш подход неверен.

Сначала создайте секционированную таблицу, например,

CREATE TABLE ORDERHDR_PART (....)
PARTITION BY RANGE (LASTUPDATE) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
  (
  PARTITION ORDERHDR_INITIAL VALUES less than (DATE '2000-01-01')
  );

Затем перенесите существующие данные в новую таблицу.

Либо вы используете простой INSERT INTO ORDERHDR_PART SELECT * FROM ORDERHDR_2017; Oracle будет создавать ежемесячные разделы автоматически на основе значения LASTUPDATE.С помощью этих методов вы дублируете (временно) ваши данные и / или вы можете столкнуться с проблемой производительности.

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

ALTER TABLE ORDERHDR_PART 
  EXCHANGE PARTITION FOR (DATE '2017-01-01')
  WITH TABLE ORDERHDR_2017
  INCLUDING INDEXES;

Я не знаю, создается ли автоматически "PARTITION FOR (DATE '2017-01-01')", возможно, вам придется запустить INSERT INTO ORDERHDR_PART (LASTUPDATE) VALUES (DATE '2017-01-01'); ROLLBACK;, чтобы сначала создать его.

Вы получите один раздел за все месяцы, после чего вы можете разделить раздел с помощью Разделение на несколько разделов .Должно быть так:

ALTER TABLE ORDERHDR_PART SPLIT PARTITION FOR (DATE '2017-01-01') INTO ( 
   PARTITION ORDERHDR_PART_JAN VALUES less than (TO_DATE('01-02-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_FEB VALUES less than (TO_DATE('01-03-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_MAR VALUES less than (TO_DATE('01-04-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_APR VALUES less than (TO_DATE('01-05-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_MAY VALUES less than (TO_DATE('01-06-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_JUN VALUES less than (TO_DATE('01-07-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_JUL VALUES less than (TO_DATE('01-08-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_AUG VALUES less than (TO_DATE('01-09-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_SEP VALUES less than (TO_DATE('01-10-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_OCT VALUES less than (TO_DATE('01-11-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_NOV VALUES less than (TO_DATE('01-12-2018','DD-MM-YYYY')),
   PARTITION ORDERHDR_PART_DEC VALUES less than (TO_DATE('01-01-2019','DD-MM-YYYY'))
);

Обратите внимание, по умолчанию вы не можете удалить начальный раздел многораздельной таблицы RANGE.Если вы столкнулись с этой проблемой, выполните:

ALTER TABLE ORDERHDR_PART SET INTERVAL ();
ALTER TABLE ORDERHDR_PART DROP PARTITION ORDERHDR_INITIAL;
ALTER TABLE ORDERHDR_PART SET INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'));
...