Автоматическое разбиение списка - PullRequest
0 голосов
/ 17 декабря 2018

Я использую Oracle 11g.

У меня есть большая таблица, в которую я хочу добавить разделы.Мой ключевой столбец раздела (и подраздела) имеет тип VARCHAR2.

Я знаю, что существует INTERVAL RANGE PARTITION, который может быть создан автоматически, но мне нужно сделать то же самое с list partition.Есть ли способ сделать это с типом VARCHAR2 (который не представляет никакой даты).

Пример:

create table t1 (name varchar2(30), company varchar2(10), value number);

Я хочу, чтобы для каждого нового nameбыть новым разделом.Есть ли способ сделать это без написания специального кода PL / SQL, который проверит, нужен ли новый раздел, и выполнит ли его создание?Может быть с каким-то рисунком или чем-то ...

1 Ответ

0 голосов
/ 17 декабря 2018

Автоматическое разбиение списка было добавлено в 12.2 .Так что вам нужно обновить, чтобы сделать это.

Тем временем вы можете создать универсальный раздел по умолчанию.Затем разделите новые значения по мере необходимости:

create table t (
  c1 int
) partition by list ( c1 ) (
  partition pdef values ( default ) 
);

select partition_name, high_value 
from   user_tab_partitions
where  table_name = 'T';

PARTITION_NAME   HIGH_VALUE   
PDEF             default     

insert into t values ( 1 );
insert into t values ( 2 );

alter table t 
  split partition pdef
  values ( 1 ) into ( 
    partition p1, partition pdef 
  );

alter table t 
  split partition pdef
  values ( 2 ) into ( 
    partition p2, partition pdef 
  );

select partition_name, high_value 
from   user_tab_partitions
where  table_name = 'T';

PARTITION_NAME   HIGH_VALUE   
P1               1            
P2               2            
PDEF             default  

Когда вы доберетесь до 12.2, вы можете переключить его в автоматический список.Но сначала вам нужно удалить раздел по умолчанию!

alter table t set partitioning automatic;

ORA-14852: SET [SUB]PARTITIONING AUTOMATIC is not legal on this table.

alter table t drop partition pdef;

alter table t set partitioning automatic;

insert into t values ( 3 );

select partition_name, high_value 
from   user_tab_partitions
where  table_name = 'T';

PARTITION_NAME   HIGH_VALUE   
P1               1            
P2               2            
SYS_P5201        3            
...