一.表分区的概念。
当表中的数据量不断增大,插叙数据的速度就会变慢,应用程序的性能就会下降这是就应该考虑对表进行分区。表进行分区后逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放在多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
二:表分区的优点以及分类
1. 改善查询的性能,对分区对象的查询课可以仅搜索自己关心你的分区,提高检索速度。
2. 改善可用性:如果表的某个分区出现故障,表在其他分区的数据依然可以。
3.维护方便:如果表的某分区出现故障,需要修复数据,之修复该分区即可。
4.均衡I/O:可以把不同的分区映射到不同的磁盘一平衡I/O,改善整个系统性能。
表分区的分类:
1. 范围分区:
就是根据数据库 表中某一字段的值的返回来划分的
01.每一个分区都必须有一个VALUES LESS THAN 字句,他指定了一个不包括在该分区中的上限值。分区键的任何值等于或大于这个上限值的记录 都会被加入到下一个高一些 的分区中。
02.所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
03.在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值null。
----创建表的时候创建范围分区
---创建teacher表 create table TEACHER ( tno NUMBER(4) not null, tname VARCHAR2(30) not null, tid CHAR(18), gendar CHAR(3), birthdate DATE, job VARCHAR2(20), hiredate DATE, sal NUMBER(7,2), deptno NUMBER(2), mgrno NUMBER(4), comm NUMBER(7,2) ) partition by range (tno) ( partition part1 values less than (1040) tablespace partition1, partition part2 values less than (1080) tablespace partition2, partition part3 values less than (maxvalue) tablespace partition3 ); //插入数据 insert into TEACHER (TNO, TNAME, TID, GENDAR, BIRTHDATE, JOB, HIREDATE, SAL, DEPTNO, MGRNO, COMM) values (1002, '赵辉', '110101760609001 ', '男', to_date('09-06-1976', 'dd-mm-yyyy'), '考试专员', to_date('23-05-2006 02:40:40', 'dd-mm-yyyy hh24:mi:ss'), 29370.95, 40, null, null);
查询表的 所有分区的信息
select * from all_tab_partitions;
运行结果:
--查询表主分区
select * from teacher partition(part1);
select * from teacher partition(part2);
select * from teacher partition(part3);
运行结果: 第一部分从0 到1040是part1 的数据
运行结果:第二部分从1040 到 1080之间的数据
运行结果:第三部分从1080 到 最大值之间的数据
2.列表分区
特点是某列的值只有几个,基于这样的特点我们可以采用列表分区,创建一个按字段列表固定可枚举值区分的表。插入记录分区字段的值必须在列表中,否则不能被插入
例如:性别 男 女
省会 北上广 杭州西安郑州
-----创建表的时候创建列表分区
partition by list(gandar)
(
partition part1 values ('男') tablespace partition1,
partition part2 values ('女') tablespace partition2
);
代码:
---创建表teacher list gendar create table TEACHER ( tno NUMBER(4) not null, tname VARCHAR2(30) not null, tid CHAR(18), gendar CHAR(3), birthdate DATE, job VARCHAR2(20), hiredate DATE, sal NUMBER(7,2), deptno NUMBER(2), mgrno NUMBER(4), comm NUMBER(7,2) )partition by list (gendar) ( partition part1 values('男')tablespace partition1, partition part2 values('女')tablespace partition2 ); insert into TEACHER (TNO, TNAME, TID, GENDAR, BIRTHDATE, JOB, HIREDATE, SAL, DEPTNO, MGRNO, COMM) values (1002, '赵辉', '110101760609001 ', '男', to_date('09-06-1976', 'dd-mm-yyyy'), '考试专员', to_date('23-05-2006 02:40:40', 'dd-mm-yyyy hh24:mi:ss'), 29370.95, 40, null, null); insert into TEACHER (TNO, TNAME, TID, GENDAR, BIRTHDATE, JOB, HIREDATE, SAL, DEPTNO, MGRNO, COMM) values (1003, '杨利乐', '110101198705256045', '女', to_date('25-05-1987', 'dd-mm-yyyy'), '考试专员', to_date('24-11-2011 16:08:38', 'dd-mm-yyyy hh24:mi:ss'), 7134.32, 40, null, null);
---查询所有分区的信息
Select * from all_tab_partitions;
--查询表主分区
select * from teacher partition(part1)
select * from teacher partition(part2)
运行结果:第一部分 查询出所有男生的记录
第二部分 查询 所有女生 的记录
3. 散列分区 hash 分区
hash 分区最主要的机制是根据hash算法来计算具体某条记录应该插入到哪个分区,hash 算法
中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
---创建表teacher Hash分区
create table TEACHER
(
tno NUMBER(4) not null,
tname VARCHAR2(30) not null,
tid CHAR(18),
gendar CHAR(3),
birthdate DATE,
job VARCHAR2(20),
hiredate DATE,
sal NUMBER(7,2),
deptno NUMBER(2),
mgrno NUMBER(4),
comm NUMBER(7,2)
)partition by hash (gendar)
(
partition part1 tablespace partition1,
partition part2 tablespace partition2
);
运行结果:
运行结果:
4.复合分区:
分为两种:
range-list(范围-列表分区)和range-hash(范围-hash 分区)
注意点:
列表分区不支持多列,但是范围分区和哈希分区支持多列。
01.range-list(范围-列表分区)
1)基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。
---查询所有子分区的信息
select * from teacher subpartition(part1sub1);--------在1040 之前的男生的记录
select * from teacher subpartition(part1sub2);--------在1040 之前的女生的记录
select * from teacher subpartition(part2sub1);--------在1040-1080 之间的男生的记录
select * from teacher subpartition(part2sub2);--------在1040 -1080之间的女生的记录
select * from teacher subpartition(part3sub1);--------在1080-1010 之间的男生的记录
select * from teacher subpartition(part3sub2);--------在1080-1010 之间的女生的记录
代码如下:
create table TEACHER
(
tno NUMBER(4) not null,
tname VARCHAR2(30) not null,
tid CHAR(18),
gendar CHAR(3),
birthdate DATE,
job VARCHAR2(20),
hiredate DATE,
sal NUMBER(7,2),
deptno NUMBER(2),
mgrno NUMBER(4),
comm NUMBER(7,2)
)partition by range(tno) subpartition by list(gendar)
(
partition part1 values less than (1040)tablespace partition1
(
subpartition part1sub1 values('男') tablespace partition1,
subpartition part1sub2 values('女') tablespace partition1
),
partition part2 values less than (1080)tablespace partition2
(
subpartition part2sub1 values('男') tablespace partition2,
subpartition part21sub2 values('女') tablespace partition2
),
partition part3 values less than (1100)tablespace partition3
(
subpartition part3sub1 values('男') tablespace partition3,
subpartition part3sub2 values('女') tablespace partition3
)
);
查看第一部分的记录
select * from teacher partition(part1) -----在1040之前的所有男 和女的记录
查看第二部分的记录
select * from teacher partition(part2)-----在1040-1080之间的所有男 和女的记录
查看第三部分的记录
select * from teacher partition(part3)-----在1080-1010之间的所有男 和女的记录
02.range-hash(范围-hash分区)
partition by range(tno)subpartition by hash(tname)
(
partition part1 values less than(1040) tablespace partition1(
subpartition part1sub1 tablespace partition1,
subpartition part1sub2 tablespace partition2
),
partition part2 values less than(1080) tablespace partition2(
subpartition part2sub1 tablespace partition1,
subpartition part2sub2 tablespace partition2
),
partition part3 values less than(maxvalue) tablespace partition3(
subpartition part3sub1 tablespace partition1,
subpartition part3sub2 tablespace partition2
)
);
代码如下:
create table TEACHER
(
tno NUMBER(4) not null,
tname VARCHAR2(30) not null,
tid CHAR(18),
gendar CHAR(3),
birthdate DATE,
job VARCHAR2(20),
hiredate DATE,
sal NUMBER(7,2),
deptno NUMBER(2),
mgrno NUMBER(4),
comm NUMBER(7,2)
)partition by range(tno) subpartition by hash(tname)
(
partition part1 values less than (1040) tablespace partition1
(
subpartition part1sub1 tablespace partition1,
subpartition part1sub2 tablespace partition1
),
partition part2 values less than(1080) tablespace partition2(
subpartition part2sub1 tablespace partition1,
subpartition part2sub2 tablespace partition2
),
partition part3 values less than(maxvalue) tablespace partition3(
subpartition part3sub1 tablespace partition1,
subpartition part3sub2 tablespace partition2
)
);
select * from teacher subpartition(part1sub1); 第一部分 查询1040 之前所有
select * from teacher subpartition(part1sub2); 第一部分 查询1040 之前所有
select * from teacher subpartition(part2sub1); 第二部分 查询1040-1080 之前所有
select * from teacher subpartition(part2sub2); 第二部分 查询1040-1080 之前所有
select * from teacher subpartition(part3sub1); 第三部分 查询1080-1010 之前所有
select * from teacher subpartition(part3sub2); 第三部分 查询1080-1010 之前所有
四:查询表分区
1.查询主分区
select * from teacher partition(part1);
2.查询子分区
select * from teacher subpartition(part1sb1);
3.查询所有分区的信息
select * from all_tab_partitions;
五:删除表分区
1.删除表中指定的分区 包含数据
alter table 表名 drop partition 分区名称;
2. 删除指定分区中的数据,分区还在
alter table 表名 truncate partition 分区名称;
上面的两条命令都不会彻底的删除分区表,再查询还是会有信息,就相当于把数据放进了回收站!
3. 彻底删除表分区 使用
drop table teacher purge;
4. 清空回收站中指定的表
purge table teacher