表分区:将一个表格的数据,按照不同的特征,分开进行存放和管理
一、表分区的创建方法
create table 表名(
列名 数据类型
)
partition by 分区类型(分区的列名)
(
分区的规则设置
);
分区表格创建的目的:
1. 可以在设置分区的时候,指定每个分区绑定不同的表空间和数据文件,
可以更加精细化的管理每个分区不同的数据
2. 分区可以让我们在搜索分区列的时候,减少数据的搜索量,加快表格查询的速度,减少查询
sql语句消耗的资源
查询所有的分区表和分区信息:
select * from user_tab_partitions;
1.1 散列分区,hash哈希
哈希是一种数据库里面的算法,一般用来处理看不出规律的数据,哈希算法会将所有的数据分别
进行算法计算,将计算结果进行分类。
create table 散列分区表名字(
列名 数据类型
)
partition by hash(列名)
(
partition 分区名 tablespace 表空间名字,
partition 分区名
);
create table hash_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)
partition by hash(ename)
(
partition p_n1,
partition p_n2,
partition p_n3,
partition p_n4
);
查看某一个分区的数据和内容:
select * from 分区表名字 partition(分区名);
select * from hash_emp partition(p_n4);
1.2 列表分区 list 适用于某个字段含有大量重复信息的列
一般使用在性别、商品分类、地区、部门、岗位......
create table 列表分区的表名(
列名 数据类型
)
partition by list(列表分区的字段名)
(
partition 分区名字 values (分区字段的内容)
);
create table list_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)
partition by list(deptno)
(
partition p_d10 values (10),
partition p_d20 values (20),
partition p_d30 values (30)
);
1.3 范围分区 range 某个字段是数值或者是时间类型的时候,可以根据数据的范围进行内容和分区的划分
一般使用的字段是 年龄、价格、工资、注册时间...
create table 范围分区的表名(
列名 数据类型
)
partition by range(范围分区的字段名)
(
partition 分区名字 values less than (数值),
.......
partition 分区名字 values less than (maxvalue)
);
create table range_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)
partition by range(sal)
(
partition p_sc values less than(2001), --0-2000
partition p_sb values less than(3001), --2001-3000
partition p_sa values less than(maxvalue) --所有大于等于3001的
);
使用场景最多的,就是使用时间进行每天分区的划分:
最多的是对数据进行离线的数据处理和计算,采用的是T+1的模式,每一天都会有一个自己的分区去处理和管理每一天独立的数据。
1.4 组合分区 是两两不同的分区类型的组合,父分区+子分区进行搭配的组合形式
create table 表名(
列名 数据类型
)
partition by 父分区分区类型(父分区的字段名字)
subpartition by 子分区分区类型(子分区的字段名字)
(
partition 父分区名字 父分区规则(
subpartition 子分区名字 子分区规则
)
);
--创建一个 用部门列表分区做父分区,用工资范围做子分区
create table zuhe_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)
partition by list(deptno)
subpartition by range(sal)
(
partition p_10 values(10)(
subpartition p10_c values less than(2001),
subpartition p10_b values less than(3001),
subpartition p10_a values less than(maxvalue)
),
partition p_20 values(20)(
subpartition p20_c values less than(2001),
subpartition p20_b values less than(3001),
subpartition p20_a values less than(maxvalue)
),
partition p_30 values(30)(
subpartition p30_c values less than(2001),
subpartition p30_b values less than(3001),
subpartition p30_a values less than(maxvalue)
)
);