创建范围分区表¶
范围分区依据用户创建水平分区时设定的分区键值范围将数据映射到不同分区。范围分区是较常用的水平分区方式,通常针对日期数据使用。例如,用户可以将销售数据按月存储到相应的分区表中。在CREATE TABLE语句中指定PARTITION BY RANGE从句即是说明表采用的是范围分区方式。
分区键不可以是以下类型,ROWID、CLOB、BLOB、XML、TIMESTAM WITH TIME ZONE或者TIME WITH TIME ZONE。
用户可以为最大分区定义一个MAXVALUE修饰符。MAXVALUE代表一个无穷大值,用于识别大于所有可能分区键的数据(包括null)。
在采用范围分区时,应注意以下规则:
- 定义子分区表时必须使用VALUES LESS THAN子句定义子分区表的开区间上限。分区键值大于等于此开区间上限值的数据将被存储到下一个子分区表中。
- 除了第一个子分区表之外,其他所有子分区表都有一个隐式的下限,此下限是由上一个子分区表的VALUES LESS THAN子句指定的。
- 用户可以为最后一个子分区表定义一个MAXVALUE修饰符。MAXVALUE代表一个无穷大值,用于识别大于所有可能分区键的数据(包括null)。
- 范围分区的最后一个子分区表的VALUES值,可以不选择MAXVALUE,但是这就对表增加了限制,当插入的值大于用户设定的上限值时,记录将不能被插入表中。
- LESS THAN后的数据类型必须与分区键的数据类型能够进行比较运算,如果不能满足这个条件,创建范围分区表将会失败。
创建范围分区表举例:
示例1:简单的范围分区表¶
下面的例子创建有两个子分区表的范围分区表,列time_id为分区列,它的值就是具体行的分区键值。VALUES LESS THAN子句决定子分区表边界,分区键值比子分区表边界小的数据行就被存储在该子分区表中。每一个子分区表都有一个分区名字(p1,p2,…),每一个子分区表都有属于自己的表空间(ts1,ts2,…)
-- 清理环境
DROP TABLE ts_range;
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_range
(
id NUMERIC(6) ,
time_id DATE
)
PARTITION BY RANGE (time_id)
(
PARTITION p1 VALUES LESS THAN ('2006-APR-01') TABLESPACE ts1,
PARTITION p2 VALUES LESS THAN ('2006-JUL-01') TABLESPACE ts2
);
insert into ts_range values(1,'2006-MAR-17');
select * from ts_range partition (p1) order by id;
ID(numeric) |TIME_ID(date) |
------------------------------------
1 |2006-03-17 |
总数目:1
-- 删除表和表空间
DROP TABLE ts_range CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;
如果存在一行数据它的time_id 值为2006-MAR-17,那么它存储在p2子分区表中。
示例2:含有复杂属性的范围分区表¶
下面的例子在上面的例子上添加一些复杂的属性。STORAGE参数和LOGGING属性被指定在表级别,替代了表从表空间级别继承这些属性,这些属性也被范围分区表继承。当某个分区里的数据特别少时,分区的STORAGE属性可以被设置很小:
-- 清理环境
DROP TABLE ts_range;
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_range
(
id NUMERIC(6),
time_id DATE
)
STORAGE (INITIAL 128K NEXT 64K) LOGGING
PARTITION BY RANGE (time_id)
(
PARTITION sales_q1 VALUES LESS THAN ('2006-APR-01') TABLESPACE ts1,
PARTITION sales_q2 VALUES LESS THAN ('2006-JUL-01') TABLESPACE ts2
);
-- 删除表和表空间
DROP TABLE ts_range CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;