分区表
在大型应用中,数据表可能会非常巨大,为了使用户在大量数据读写、查询中速度更快,可使用分区技术。
分区表就是把非常大的表分割成较小的片段(分区),在实际应用中在独立分区上操作各个部分,而对用户透明。
分区表有5中类型:范围分区、散列分区、列表分区、组合范围散列分区、组合范围列表分区。
1、范围分区(range)
对数据表中某个值的范围进行分区,格式如下:
create
table
t1_trans
(
trans_id
number
,
item
varchar2
(
300
),
trans_date
date
,
trans_state
varchar2
(
10
)
)
partition
by
range
(trans_id)
(
partition
part_01
values
less
than
(
10000
)
tablespace
wxq_tbs,
partition
part_02
values
less
than
(
30000
)
tablespace
users,
partition
part_03
values
less
than
(
maxvalue
)
tablespace
system
);
注:必须要从小到达,分类排列。不满足当前分区条件的,则被放入下一分区。
2、散列分区(hash)
散列分区是根据hash算法均匀分布在各个分区上,格式如下:
create
table
t1_trans
(
trans_id
number
,
item
varchar2
(
300
),
trans_date
date
,
trans_state
varchar2
(
10
)
)
partition
by
hash
(trans_id)
(
partition
part_01
tablespace
wxq_tbs,
partition
part_02
tablespace
users,
partition
part_03
tablespace
system
);
3、列表分区(list)
列表分区用于对非数值的数据类型分类分区,要列举出来,值不能太多
create
table
t1_trans
(
trans_id
number
,
item
varchar2
(
300
),
trans_date
date
,
trans_state
varchar2
(
10
)
)
partition
by
list
(trans_state)
(
partition
part_01
values
(
'
杭州
'
,
'
南京
'
)
tablespace
wxq_tbs,
partition
part_02
values
(
'
上海
'
,
'
北京
'
)
tablespace
users,
partition
part_02
values
(
default
)
tablespace
system
);
4、组合范围散列分区
在根据范围分区之后,还要对每个分区的数据散列分布在几个表空间中
createtable t1_trans
(
trans_id number,
item varchar2(300),
trans_date date,
trans_state varchar2(10)
)
partitionbyrange (trans_date)
subpartitionbyhash (trans_id)
subpartitions3storein (wxq_tbs,users,system)
(
partition part_01 valueslessthan(date'2008-01-01'),
partition part_02 valueslessthan(date'2009-01-01'),
partition part_03 valueslessthan(maxvalue)
);
注:使用hash是为了使数据分散到各个tablespace,使用range是为了查询、操作时分开part_01,功能不同!
5、组合范围列表分区
先对范围分区,然后根据列表值再分区,可以交叉tablespace
createtable t1_trans
(
trans_id number,
item varchar2(300),
trans_date date,
trans_state varchar2(10)
)
partitionbyrange (trans_id)
subpartitionbylist (trans_state)
( partition part_01 valueslessthan(10000)
(subpartition part_01_1 values ('杭州','南京') tablespace wxq_tbs,
subpartition part_01_2 values (default) tablespace users ),
partition part_02 valueslessthan(maxvalue)
(subpartition part_02_1 values ('杭州','南京') tablespace wxq_tbs,
subpartition part_02_2 values (default) tablespacesystem )
);
注:4、5两种方法简单了解一下就可以,记住格式。
6、通过as select建立分区表
createtable t1_trans_2
partitionbyrange (polno)
(
partition part_01 valueslessthan(210010000000000) tablespace users,
partition part_02 valueslessthan(maxvalue) tablespace wxq_tbs
)
as
select * from lcpol;
注:as语句必须写在分区的后面。
分区表的操作
对于分区表,可以进行与正常的堆表一样的所有操作,另外还可以专门针对分区进行操作。
1、查找某分区数据
select * from t1_trans partition(part_01);
2、操作某分区数据
delete t1_trans partition(part_01);
注:当数据量很大的时候,指定分区会大大提高效率
分区表维护
1、删除分区
altertable t1_trans
droppartition part_02;
注:删除分区会自动删除分区中的所有数据,而不是交由剩下分区。
2、添加分区
altertable t1_trans
addpartition part_02 valueslessthan(20000) tablespace users;
注:添加时不能在两个范围内插入分区,必须要大于最后一个分区的最大值。
3、合并分区
altertable t1_trans
mergepartitions part_01,part_02 intopartition part_new;
注:合并时不能将结果partition命名为小的那个partition名字。
4、分裂分区
altertable t1_trans
splitpartition part_02 at (20000) into (partition part_02,partition part_03);
5、改换分区所属tablespace
altertable t1_trans
movepartition part_03 tablespace wxq_tbs;