ORACLE 创建分区表(Range模式)
什么是范围分区(Range)?
根据预先定义的范围来划分分区,范围分区最适合管理类似且有明显顺序的数据,根据数据的顺序可以很容易划定分区范围。
范围分区表是通过:
create table 语句的 partition by range 子句来创建的;
分区的范围通过 values less than 子句指定;
其指定的是分区的上限(不包含),所有大于等于指定值的数据被分配至下一个分区,除了第一个分区,每个分区的下限即前一个分区的上限:
create table members ( id number, name varchar2(32), create_time date) partition by range(create_time) ( partition p1 values less than (to_date('2023-02-01', 'yyyy-mm-dd')), partition p2 values less than (to_date('2023-03-01', 'yyyy-mm-dd')), partition pmax values less than (maxvalue) );
上面的例子中定义了3个分区:
所有create_time小于'2023-02-01'的数据(不包含)被分配在分区p1中。
所有create_time小于'2023-03-01'的数据(不包含),大于'2023-02-01'的数据(包含)被分配在p2中。
所有create_time大于等于'2023-03-01'的数据被分配在pmax中,如果没有这个分区,那么插入大于等于'2023-03-01'的数据时,会因为没有合适的存储分区而报错。
你也可以在定义分区时指定存储特性,例如将分区分散到不同的表空间(表空间可以放到不同的物理磁盘上):
create tablespace tbs1; create tablespace tbs2; create tablespace tbs3; create table members ( id number, name varchar2(32), create_time date) partition by range(create_time) ( partition p1 values less than (to_date('2023-02-01', 'yyyy-mm-dd')) tablespace tbs1, -- 指定分区p1放在tbs1中 partition p2 values less than (to_date('2023-03-01', 'yyyy-mm-dd')) tablespace tbs2, partition pmax values less than (maxvalue) tablespace tbs3 );
拓展:间隔分区(Interval partition)-> 推荐使用
间隔分区是范围分区的一个扩展,它也是通过范围来划分分区,唯一的区别是:间隔分区可以在相应分区数据插入时自动创建分区,省去了普通范围分区手动创建分区的操作。
如果不是需要创建不规则的范围分区,那么更推荐使用间隔分区来替代范围分区,你只需要指定一个分区间隔及初始分区,后续的分区创建将由Oracle自动完成。
间隔分区表的创建由在普通范围分区定义上新增一个interval子句创建:
create table inv_part ( id number, name varchar2(32), create_time date) partition by range(create_time) interval (numtoyminterval(1, 'MONTH')) -- 指定分区间隔 ( partition p1 values less than (to_date('2023-02-01', 'yyyy-mm-dd')) );
上面的例子指定在初始分区p1的基础上,每隔1个月创建一个分区。
通过视图user_tab_partitions可以看到目前只有1个分区p1:
select table_name, partition_name from user_tab_partitions where table_name='INV_PART';
我们在初始分区的上限之上插入一条数据:
insert into inv_part values(1, 'Vincent', date '2023-02-02'); commit; select table_name, partition_name from user_tab_partitions where table_name='INV_PART';
在现有分区之上插入数据时,Oracle自动为我们创建了1个对应的分区SYS_P327。
对于间隔分区,你也可以通过 store in 子句指定多个表空间,Oracle将以循环的方式在各个表空间中创建分区。
create table multi_tbs ( id number, name varchar2(32), create_time date) partition by range(create_time) interval (numtoyminterval(1, 'MONTH')) store in (tbs1, tbs2, tbs3) ( partition p1 values less than (to_date('2023-02-01', 'yyyy-mm-dd')) tablespace tbs1 );
查询初始分区的所属表空间:
select table_name, partition_name, tablespace_name from user_tab_partitions where table_name='MULTI_TBS';
插入两条数据,触发自动创建新的分区:
insert into multi_tbs values(1, 'Vincent', date '2023-02-02'); insert into multi_tbs values(2, 'Victor', date '2023-03-02'); commit; select table_name, partition_name, tablespace_name from user_tab_partitions where table_name='MULTI_TBS';
可以看到Oracle自动以循环的方式在3个表空间中创建了分区。