Страницы

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

пятница, 15 февраля 2019 г.

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

Цель: Автоматическое добавление новых партиций при добавлении нового текстового значения
Ситуация: Поступают записи, в одном поле которых есть повторяющееся текстовое значение. На это поле в целевой для этих данных таблице создана партиция. В качестве значения этого поля может прийти новое значение, которого нет в существующих партициях. Возникает ошибка, связанная с отсутствие соответствующей секции. Списком эти партиции не сделать так, как заранее не известны значения, которые могут поступать.
Вопрос: Можно ли для этого случая организовать автоматическое добавление необходимых секций? Без триггера, только средствами организации таблицы.
Что то типа такого (выдуманный пример):
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 - значений )


Ответ

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

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

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