Oracle 自动列表分区

Oracle 自动列表分区,oracle,varchar,database-partitioning,Oracle,Varchar,Database Partitioning,我正在使用Oracle 11g 我有一个要添加分区的大表。我的分区(和子分区)键列属于VARCHAR2类型 我知道有一个可以自动创建的间隔范围分区,但是我需要对列表分区做同样的事情。有没有办法用VARCHAR2type(不代表任何日期)实现这一点 例如: create table t1 (name varchar2(30), company varchar2(10), value number); 我希望每个新的名称都有一个新的分区。有没有一种方法可以做到这一点,而不用编写特定的PL/SQL代

我正在使用Oracle 11g

我有一个要添加分区的大表。我的分区(和子分区)键列属于
VARCHAR2
类型

我知道有一个可以自动创建的
间隔范围分区
,但是我需要对
列表分区
做同样的事情。有没有办法用
VARCHAR2
type(不代表任何日期)实现这一点

例如:

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

我希望每个新的
名称都有一个新的分区。有没有一种方法可以做到这一点,而不用编写特定的PL/SQL代码来检查是否需要一个新分区并进行创建?可能有一些模式或其他什么…

自动列表分区被使用。所以你需要升级才能做到这一点

同时,您可以创建一个包罗万象的默认分区。然后根据需要拆分新值:

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            

很遗憾,您需要升级。Oracle 12c R2引入了自动列表分区。谢谢,看起来是个好主意。拆分时是否存在访问默认分区数据的问题?@user2671057您的意思是在自动拆分时查询它?我没有意识到任何问题;但我还没有进行过广泛的测试,我的意思是在11g版本中查询默认分区——在ALTERTABLESPILT分区时。通过我的测试,它将导致对象-不再存在异常。如果查询在整个表上,它也会引发。。。这是我的问题。