自动创建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等方式对字段进行处理后再分区。