【问题标题】:Automatic list partitioning自动列表分区
【发布时间】:2018-12-17 09:29:40
【问题描述】:

我使用的是 Oracle 11g。

我有想要添加分区的大表。我的分区(和子分区)键列是VARCHAR2 类型。

我知道有一个可以自动创建的INTERVAL RANGE PARTITION,但我需要对list partition 做同样的事情。有没有办法使用VARCHAR2 类型(不代表任何日期)来做到这一点。

例子:

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

我希望每个新的name 都会有一个新分区。有没有办法做到这一点,而无需编写特定的 PL/SQL 代码来检查是否需要新分区并进行创建?也许有一些模式或其他东西......

【问题讨论】:

  • 很遗憾您需要升级。 Oracle 12c R2 引入了自动列表分区。 Find out more

标签: oracle varchar database-partitioning


【解决方案1】:

自动列表分区是added in 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            

【讨论】:

  • 谢谢,看起来是个好主意。分裂时访问默认分区的数据有问题吗?
  • @user2671057 你的意思是在自动拆分发生时查询它?我不知道有任何问题;但我没有进行广泛的测试。
  • 我的意思是在 11g 版本中查询默认分区 - 在更改表拆分分区时。在我的测试中,它会导致对象不再存在异常。如果查询在整个表上,它也会引发......这是我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多