Могу ли я создать растущую секционированную таблицу Interval с разделом по умолчанию / maxvalue? - PullRequest
0 голосов
/ 17 апреля 2019

Краткое изложение вопроса: Создать таблицу с разделами, которые разбиты по диапазонам. Однако записи, которые не знают значения диапазона, должны находиться в другом разделе (по умолчанию) и перемещаться в правильный раздел после заполнения значения. Раздел по умолчанию никогда не будет удален, в то время как другие разделы будут удалены после определенного периода хранения с помощью сценария.

Вся история:

У меня есть таблица, в которой записи должны быть размещены в разделе на основе поля даты. Это растущая таблица, и через некоторое время данные из этих разделов могут быть удалены. Я использовал для создания таблицы что-то вроде фрагмента ниже.

Это прекрасно работает, потому что мы знали значение столбца даты, на основе которого мы разбиваем (RDATE). Однако в нашем новом проекте мы не знаем этого, когда вставляется запись. В конечном итоге это значение будет заполнено в ходе обработки заявки.

Моей первоначальной мыслью было создание MAXPARTITION (MAXVALUE), которое было бы универсальным разделом для записей, у которых не заполнена дата, и включало ROW MOVEMENTS, чтобы при заполнении даты оно перемещалось в соответствующий раздел. Однако я думаю, что невозможно иметь как MAXVALUE разделение, так и разделение интервала вместе. Это верно?

Также Есть ли лучший способ сделать это?

PARTITION BY RANGE ("RDATE") INTERVAL (NUMTODSINTERVAL (1,'DAY')) 
SUBPARTITION BY HASH ("RKEY") 
SUBPARTITION TEMPLATE ( 
   SUBPARTITION "SP01", 
   SUBPARTITION "SP02", 
   SUBPARTITION "SP03", 
   SUBPARTITION "SP04", 
   SUBPARTITION "SP05", 
   SUBPARTITION "SP06", 
   SUBPARTITION "SP07", 
   SUBPARTITION "SP08", 
   SUBPARTITION "SP09", 
   SUBPARTITION "SP10", 
   SUBPARTITION "SP11", 
   SUBPARTITION "SP12", 
   SUBPARTITION "SP13", 
   SUBPARTITION "SP14", 
   SUBPARTITION "SP15", 
   SUBPARTITION "SP16" ) 
(PARTITION "INITIALPARTITION"  VALUES LESS THAN (TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 

Я ожидаю, что таблица с разделами и записями по умолчанию и диапазонами переместится в разделы диапазона по умолчанию после заполнения столбца.

1 Ответ

1 голос
/ 17 апреля 2019

Столбец, который вы используете в качестве ключа раздела, не может иметь значение NULL, но вы можете использовать обходной путь, подобный следующему:

CREATE TABLE ... (
    ...
    RDATE DATE,
    PARTITION_KEY DATE GENERATED ALWAYS AS (COALESCE(RDATE, DATE '1969-12-31')) 
)
PARTITION BY RANGE (PARTITION_KEY) INTERVAL (NUMTODSINTERVAL (1,'DAY'))
...
(PARTITION INITIAL_PARTITION VALUES LESS THAN (DATE '1970-01-01'))
ENABLE ROW MOVEMENT;

Если вы вставите запись с RDATE = NULL, то она будет вставлена ​​в раздел INITIAL_PARTITION.Для исходных данных (например, 1970-01-01) вы должны выбрать значения, которые никогда не попадут в «реальные» значения даты.Вы также можете использовать дату в далеком будущем, например,

CREATE TABLE ... (
    ...
    RDATE DATE,
    PARTITION_KEY DATE GENERATED ALWAYS AS (COALESCE(RDATE, DATE '2999-12-31')) 
)
PARTITION BY RANGE (PARTITION_KEY) INTERVAL (NUMTODSINTERVAL (1,'DAY'))
...
(PARTITION INITIAL_PARTITION VALUES LESS THAN (DATE '2019-04-01'))
ENABLE ROW MOVEMENT;

-- Create DEFAULT_PARTITION
INSERT INTO ... (RDATE) VALUES (NULL);
ROLLBACK;
ALTER TABLE ... RENAME PARTITION FOR (TIMESTAMP '2999-12-31 00:00:00') TO DEFAULT_PARTITION;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...