创建间隔分区表

间隔分区又称自动增长分区,间隔分区是对范围分区的扩展,经常成为间隔范围分区表。当数据插入到表中时,如果超过现有的范围分区的最高边界,数据库自动创建一个指定的时间间隔的子分区表。( 注意:必须指定至少一个范围分区。)

间隔分区中范围分区表的最高边界值称为过渡点,当插入数据达到该过渡点时数据库自动创建间隔分区表。 每个间隔分区表的下边界是以前的范围或间隔分区表的非包容上限。

例如如果您创建一个间隔分区表,间隔为月,过渡点在2007年1月1日, 然后2007 年1月分区的下限是 2007年1月1日。无论2007年6月分区是否已被创建,2007年7月区间的下限都是2007年7月1日。

由于间隔分区是范围分区的一个扩展,所以间隔分区不但包含范围分区的注意规则,同时还有如下规则需要注意。

  • 分区键必须是单列,且类型必须是数值类型或时间类型。
  • 间隔分区不可以作为二级子分区表。
  • 对于VALUES,不可以是MAXVALUE,也不可以是NULL值。
  • 至少要创建一个范围子分区表,以这个子分区表的上限值为间隔分区的最大键值,当超过这个最大键值后,才可以自动增加子分区表。
  • 对于间隔分区作为一级子分区表的复合分区,如果定义了分区模板,那么当间隔分区自动增长时,会按照分区模板的定义自动增加对应的二级子分区表。如果未定义分区模板,那么当间隔分区表增长时,会自动创建一个默认的二级子分区表,如果二级子分区表为二级范围子分区表,则创建一个MAXVALUE的二级子分区表,如果是二级列表子分区表,则创建一个DEFAULT的二级子分区表,如果是二级哈希子分区表,则创建一个默认二级子分区表。
  • 间隔分区中STORE IN子句,当定义了此子句则会指定一组表空间,间隔分区表在扩展时,会循环使用这些表空间,保证数据的均衡负载。

示例:间隔分区表

--  清理环境
DROP TABLE ts_interval_1 CASCADE;
DROP TABLE ts_interval_2 CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

--  创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;

-- 创建分区表
CREATE TABLE ts_interval_1
(
    id NUMERIC(6),
    time_id DATE
)
PARTITION BY RANGE (time_id)
INTERVAL(INTERVAL '1' MONTH)
(
    PARTITION p1 VALUES LESS THAN ('2006-01-01'),
    PARTITION p2 VALUES LESS THAN ('2006-07-01')
);


CREATE TABLE ts_interval_2
(
    id NUMERIC(6),
    time_id DATE
)
PARTITION BY RANGE (time_id) 
INTERVAL (INTERVAL '1' MONTH)
SUBPARTITION BY hash(id)
SUBPARTITION template
( 
    SUBPARTITION p1 TABLESPACE ts1,
    SUBPARTITION p2 TABLESPACE ts2
)
(  
    PARTITION p1 VALUES LESS THAN ('2000-JAN-01'),
    PARTITION p2 VALUES LESS THAN ('2000-JUN-01')
);

--  删除表和表空间
DROP TABLE ts_interval_1 CASCADE;
DROP TABLE ts_interval_2 CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;