Страницы

Поиск по вопросам

вторник, 31 марта 2020 г.

Автодобавление текстовых партиций

#sql #oracle #plsql #oracle11g


Цель: Автоматическое добавление новых партиций при добавлении  нового текстового значения

Ситуация: Поступают записи, в одном поле которых есть повторяющееся текстовое значение.
На это поле в целевой для этих данных таблице создана партиция. В качестве значения
этого поля может прийти новое значение, которого нет в существующих партициях. Возникает
ошибка, связанная с отсутствие соответствующей секции. Списком эти партиции не сделать
так, как заранее не известны значения, которые могут поступать.

Вопрос: Можно ли для этого случая организовать автоматическое добавление необходимых
секций? Без триггера, только средствами организации таблицы.

Что то типа такого (выдуманный пример):

create table char_part
(
    id integer,
    txt varchar2(200)
)
partition by range (txt) interval (1) -- Проблема в автодобавлении нового текст. значения
(
    partition "abc" values less than ('abc'),
    partition "max" values less than (maxvalue) -- Для null - значений
)

    


Ответы

Ответ 1



TL;DR: В версии 11g это невозможно. Лучшее решение - перейти на 12c, так как в этой версии уже введено автоматическое лист секционирование. Можно решить задачу через секционирование по interval появившиеся в 11g. На основе бизнес требований надо продумать, как вычислqть колонку для секционирования. Как например, спроси у Тома. Предложение для задачи как в вопросе: create table char_part ( id integer, txt varchar2(200), txt# generated always as (coalesce (ora_hash (txt, power (2,20)-1), 0)) virtual ) partition by range (txt#) interval (1) ( partition "empty" values less than (0), partition "undef" values less than (1) ); insert into char_part (id, txt) select 1, 'ABC' from dual union all select 2, 'DEF' from dual union all select 3, 'ZZZ' from dual union all select 9, null from dual ; select table_name, partition_name, high_value from user_tab_partitions where table_name=upper('char_part') ; TABLE_NAME PARTITION_NAME HIGH_VALUE ---------- -------------------- ---------- CHAR_PART SYS_P1141 222410 CHAR_PART SYS_P1142 59915 CHAR_PART SYS_P1143 627928 CHAR_PART empty 0 CHAR_PART undef 1

Ответ 2



В версии 12.2 такое стало возможно. Для уже существующей таблицы ALTER TABLE char_part SET PARTITIONING AUTOMATIC;. При создании таблицы: ... PARTITION BY LIST (txt) AUTOMATIC (PARTITION part_abc VALUES ('ABC'), PARTITION part_def VALUES ('DEF')); Обратите внимание: не less than, а values, т.е. в таблице секционирование по списку, а не по диапазону значений, иначе с текстовыми данными смысл теряется. В примере также указано, что можно создать секции сразу, несмотря на автоматическое секционирование.

Комментариев нет:

Отправить комментарий