12c新特性:自动创建list分区

自动创建list分区的特性,会根据需要自动对list分区表中每一个分区字段值创建单独的分区,这样大大减轻了DBA的工作负担,就不用依靠手动操作来维护大量表分区的创建,即使有不在原分区范围的内的值出现,也不需要将它们全部放在DEFAULT分区里面。

自动list分区其实跟以前的list分区基本类似,只是在维护上更方便一些,你只有在分区键确定的情况下才能创建自动list分区。由于是根据加载数据的情况来判断是否需要自动新建分区,这点有些类似interval分区的概念。

按照以往的模式新建一个分区表,根据省份名称来进行分区,分别插入了湖北、北京、上海几条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
drop table t1 purge;

create table t1(
id number(10),
prov varchar2(20)
)
partition by list(prov)
(
partition p_hu values('hubei'),
partition p_bj values('beijing'),
partition p_sh values('shanghai')
);

insert into t1 values(1,'hubei');
insert into t1 values(2,'beijing');
insert into t1 values(3,'shanghai');
commit;

现在由于业务扩展,需要新增其他省份的数据进来,如果在没有DBA介入的情况下,直接新增数据

1
2
3
4
5
xb@PDB12C> insert into t1 values(4,'guangdong');
insert into t1 values(4,'guangdong')
*
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition

很显然guangdong并不不能落在我们现有的任何一个分区当中,那么就会直接报错,那么就需要DBA进行手动添加相关分区,这样的操作可能会发生N次,无疑是一个比较低效的做法。

自动list分区

那么来尝试使用新的list分区特性:

可以直接对现有表通过ALTER TABLE的方式来修改分区

1
alter table t1 set partitioning automatic;

也可以通过加关键字AUTOMATIC对表进行重建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
drop table t1 purge;

create table t1(
id number(10),
prov varchar2(20)
)
partition by list(prov) automatic
(
partition p_hu values('hubei'),
partition p_bj values('beijing'),
partition p_sh values('shanghai')
);

insert into t1 values(1,'hubei');
insert into t1 values(2,'beijing');
insert into t1 values(3,'shanghai');
commit;

insert into t1 values(4,'guangdong');
commit;

可以发现这次就能正常插入数据无报错,查询partition视图可以发现新生成的以SYS开头的分区名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
exec dbms_stats.gather_table_stats(user, 't1', cascade => true);

column table_name format a30
column partition_name format a30
column high_value format a15

select table_name,
partition_name,
high_value,
num_rows
from user_tab_partitions
order by 1, 2;

TABLE_NAME PARTITION_NAME HIGH_VALUE NUM_ROWS
------------------------------ ------------------------------ --------------- ----------
T1 P_BJ 'beijing' 1
T1 P_HU 'hubei' 1
T1 P_SH 'shanghai' 1
T1 SYS_P1096 'guangdong' 1

新生成的分区就容纳了新增的guangdong记录,这样即使以后再有新的省份数据添加进来也不需要DBA的介入了,也可以在user_part_tables里查询新的AUTOLIST来字段来查看表是否是自动分区

1
2
3
4
5
6
7
8
col autolist for a10
SELECT table_name,
autolist
FROM user_part_tables;

TABLE_NAME AUTOLIST
------------------------------ ----------
T1 YES

Tips:

使用这个新特性时,要慎重规划分区的分区键,否则就会造成自动创建大量的分区,特别是对那些以时间作为分区条件的时候尤为注意,最好是通过truncate等方式对字段进行处理后再分区。


12c新特性:自动创建list分区
https://www.xbdba.com/2019/06/05/12c-newfeature-create-list-partition-automatic/
作者
xbdba
发布于
2019年6月5日
许可协议