oracle表分区(一)

建立分区的好处:改善表的查询性能,使表更容易管理,便于备份和恢复,提高数据安全性。

注意:分区表不能有long或者raw long 数据类型。

 

一、分类

1、range(范围)分区

2、hash(哈希)分区

3、list(列表)分区

4、组合分区range-hash range-list。

 

二、分区选择条件

1、range分区

应用范围比较广泛的表分区方式,以列的值的范围来作为分区划分条件的,将记录放到列所在的range分区中,因此在创建的时候需要指定基于的列,以及分区的范围值,如果有些记录暂时无法预测范围,可以创建maxvalue分区,所有不在指定范围的记录都会到这个maxvalue分区中,并且支持多列作为依赖列。每个分区中的数据量不均匀

2、hash分区

应用于那些无法有效划分范围的表,这样对提高性能有所帮助,hash是将数据平均分配到你指定的几个分区中,列所在的分区时依据分区列hash值自动分配的,不能控制那条值在那个分区,支持多个依赖列。

3、list分区

需要指定列的值,单个分区值可以有多个值,其分区中的值必须明确指定,不能想range中指定范围,可以确定那个值在那个分区,但是只能有一个依赖列,分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入就会失败,因此在使用list分区时,建议创建一个default分区,用于存储那些不在指定范围内的记录,类似range的maxvalue分区。

4、组合分区

如果某表桉某列进行分区,仍然较大,或者是一些其他的需求,还可以通过分区内在建立子分区即组合分区。oracle10g中只有range-hash、range-list,根分区只能使用range分区,则分区可以是hash或者list分区。11g在组合分区功能上有所增强,range-range,list-range,list-list,list-hash,hash不能做根分区是因为数据分配是平均分配,某条记录在那个分区是不可知的。

 

三、分区创建

首先要介绍几个个数据字典表:user_part_tables、user_tab_partitions、user_tab_subpartitions

user_part_tables:记录分区表的信息

user_tab_partitions:记录表的分区信息

user_tab_subpartitions:查询表的子分区信息

 

1、range分区创建

创建一个标准的range分区表:

create table t_partition_range(id number,name varchar2(50))

paritition by range(id)(

partition t_range_p1 values less than (10) tablespace  tbspace01,

partition t_range_p2 values less than (20) tablespace  tbspace02,

partition t_range_p3 values less than (30) tablespace  tbspace03,

partition t_range_pmax values less than (maxvalue) tablespace  tbspace04

);

注:id:为分区依赖列(可以有多个,用逗号分隔)

      t_range_p1 :分区的名称

      values less than:后跟分区范围值(如果依赖列有多个,范围对应值也应是多个,中间以逗号分隔);

      tbspace03:分区的存储属性,例如所在表空间等属性(可为空),默认继承基表所在表空间的属性。

可以查看分别查看两张数据字典表有关表t_partition_range的信息。

 

2、hash分区创建

第一种方式:

create table t_partition_hash(id number,name varchar2(50))

partition by hash(id)(

partition t_hash_p1 tablespace tbspace01,

partition t_hash_p1 tablespace tbspace02,

partition t_hash_p1 tablespace tbspace03

);

第二种方式:

create table t_partition_hash2(id number,name varchar2(50))

partition by hash(id)

partitions 3 store in (tbspace01,tbspace02,tbspace03);

注:第二种方式说明可以直接指定分区数量和可供使用的表空间,表空间的数量不一定要等于分区的数量

 

3、list分区创建

create table t_partition_list (id number,name varchar2(50))
 partition by list(id)(
 partition t_list_p1 values (1,2,3,4,5,6,7,8,9) tablespace tbspart01,
 partition t_list_p2 values (10,11,12,13,14,15,16,17,18,19) tablespace tbspart02,
 partition t_list_p3 values (20,21,22,23,24,25,26,27,28,29) tablespace tbspart03,
 partition t_list_pd values (default) tablespace tbspart04);

注:list分区的依赖列只能有一个,values中的值即为id中的值。

 

4、range-hash 组合分区创建

为所有分区创建4个hash子分区

create table t_partition_rh (id number,name varchar2(50))
 partition by range(id) subpartition by hash(name)
 subpartitions 4 store in (tbspart01, tbspart02, tbspart03,tbspart04)(
 partition t_r_p1 values less than (10) tablespace tbspart01,
 partition t_r_p2 values less than (20) tablespace tbspart02,
 partition t_r_p3 values less than (30) tablespace tbspart03,
 partition t_r_pd values less than (maxvalue) tablespace tbspart04);

 

对某一个分区创建4个哈市子分区

create table t_partition_rh (id number,name varchar2(50))
 partition by range(id) subpartition by hash(name)(
 partition t_r_p1 values less than (10) tablespace tbspart01,
 partition t_r_p2 values less than (20) tablespace tbspart02,
 partition t_r_p3 values less than (30) tablespace tbspart03
 (subpartition t_r_p3_h1 tablespace tbspart01,
 subpartition t_r_p3_h2 tablespace tbspart02,
 subpartition t_r_p3_h3 tablespace tbspart03),
 partition t_r_pd values less than (maxvalue) tablespace tbspart04);

 

给各个分区创建不同的子分区:

create table t_partition_rh (id number,name varchar2(50))
 partition by range(id) subpartition by hash(name)(
 partition t_r_p1 values less than (10) tablespace tbspart01,
 partition t_r_p2 values less than (20) tablespace tbspart02
 (subpartition t_r_p2_h1 tablespace tbspart01,
 subpartition t_r_p2_h2 tablespace tbspart02),
 partition t_r_p3 values less than (30) tablespace tbspart03
 subpartitions 3 store in (tbspart01,tbspart02,tbspart03),
 partition t_r_pd values less than (maxvalue) tablespace tbspart04
 (subpartition t_r_p3_h1 tablespace tbspart01,
 subpartition t_r_p3_h2 tablespace tbspart02,
 subpartition t_r_p3_h3 tablespace tbspart03)
 );

 

分区模板应用:

在指定子分区依赖列以后,指定子分区的存储模板,各个分区即会按照子分区模式创建子分区

create table t_partition_rh (id number,name varchar2(50))
 partition by range(id) subpartition by hash(name)
 subpartition template (
 subpartition h1 tablespace tbspart01,
 subpartition h2 tablespace tbspart02,
 subpartition h3 tablespace tbspart03,
 subpartition h4 tablespace tbspart04)(
 partition t_r_p1 values less than (10) tablespace tbspart01,
 partition t_r_p2 values less than (20) tablespace tbspart02,
 partition t_r_p3 values less than (30) tablespace tbspart03,
 partition t_r_pd values less than (maxvalue) tablespace tbspart04);

 

 

5、range-list组合分区创建

其创建方式和range-hash极其相似,只是子分区是list分区,同样也可以使用分区模板

create table t_partition_rl (id number,name varchar2(50))
 partition by range(id) subpartition by list(name)
 subpartition template (
 subpartition l1 values ('aa') tablespace tbspart01,
 subpartition l2 values ('bb') tablespace tbspart02,
 subpartition l3 values ('cc') tablespace tbspart03,
 subpartition l4 values ('dd') tablespace tbspart04)(
 partition t_r_p1 values less than (10) tablespace tbspart01,
 partition t_r_p2 values less than (20) tablespace tbspart02,
 partition t_r_p3 values less than (30) tablespace tbspart03,
 partition t_r_pd values less than (maxvalue) tablespace tbspart04);

 

 

四、分区公共准则

1、如果选择的分区不能确保各个分区内记录量的基本平均,则这种分区方式有可能是不恰当的

比如对于range 分区,假设分了10 个分区,而其中一个分区中的记录数占总记录数的90%,其它9 个分区只占总记录数的10%,则这个分区方式就起不到数据平衡的作用。当然,如果你的目的并不是为了平衡,只是为了区分数据,ok,对于这种情况,我想说的是,你务必要意识到存在这个问题。

2、对于分区的表或索引,其所涉及的所有分区,其块的大小必须一致。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值