-----oracle优化之表分区
一:表分区的概念
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
二:表分区的优点以及分类
1.表分区的优点
01.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
02.增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
03.维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
04.均衡I/O:可以把不同的分区映射到不同的磁盘以平衡I/O,改善整个系统性能。
2.表分区的分类
- 范围分区
就是根据数据库表中某一字段的值的范围来划分分区
01)每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
02)所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
03)在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值null。
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 (1030) tablespace partition1,--partition1 代表表空间 part1 代表分区的名字
partition part2 values less than (1070) tablespace partition2,
partition part2 values less than (1100) tablespace partition3
);
如果我们新增的数据超过了1100将找不到指定的分区,所以会报错,载增加有一个表分区
partition part4 values less than (maxvalue) tablespace partition4
2.列表分区
特点是某列的值只有几个,
基于这样的特点我们可以采用列表分区。创建一个按字段数据列表固定可枚举值分区的表。插入记录分区字段的值必须在列表中,否则不能被插入。
比如性别! 男 女
省会名称! 北上广深一个分区 山东山西 一个分区 等
创建表的时候创建表分区
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 paratition1, partition part2 values('女') tablespace partition2 );
3.散列分区(Hash分区)
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
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(tname) ( partition part1 tablespace partition1, partition part2 tablespace partition2, partition part3 tablespace partition3, partition part4 tablespace partition4 )
4.复合分区
分为两种:
range-list(范围-列表分区)和range-hash(范围-hash分区)
注意点:
列表分区不支持多列,但是范围分区和哈希分区支持多列。
01.range-list(范围-列表分区)
1)基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。
![](https://images2017.cnblogs.com/blog/1139834/201711/1139834-20171116102333937-639666850.png)
02.range-hash(范围-hash分区)
三:创建表分区
-- 使用sysdba身份创建3个表空间 为下面的分区表数据时 做准备
create tablespace partition1 datafile 'e:\orcale\partition1.dbf' size 20m autoextend on next 20 maxsize unlimited;
四:查询表分区
1.查询指定主分区
select * from teacher partition(分区名); 如:Part1 part2 part3
2.查询指定子分区
select * from teacher subpartition(子分区名) ; 如:par1sb1
3.查询所有分区的信息
select* from all_tab_partitions;
五:删除表分区
1.删除表中指定的分区 包含数据
alter table 表名 drop partition 分区名称;
2.删除指定分区中的数据,分区还在
alter table 表名 truncate patition 分区名称;
上面的两条命令都不会彻底的删除分区表,再查询还是会有信息,就相当于把数据放进了回收站!
3.彻底删除表分区 使用
drop table teacher purge;
4.清空回收站中指定的表
purge table teacher