博客 表分区(一)• Oracle版

表分区(一)• Oracle版

   数栈君   发表于 2023-08-09 10:44  161  0

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、对于分区的表或索引,其所涉及的所有分区,其块的大小必须一致。


免责申明:

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
下一篇:
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群