oracle11g利用分区表进行查询性能的优化

来源:互联网 发布:英伟达experience优化 编辑:程序博客网 时间:2024/06/05 01:19

        当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

      Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

 什么时候使用分区表:
1、表的大小超过2GB。
2、表中包含历史数据,新的数据被增加都新的分区中。

(3).表分区的优缺点
表分区有以下优点: 
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

oracle表分区有多种分区方式(列表分区、范围分区、散列分区.....),现以最常用的列表分区为例进行说明:

---根据每个部门创建表空间,并为jack用户创建一个默认表空间
CREATE TABLESPACE tbs_jack_hr
DATAFILE 'D:\mytablespace\tbs_jack_hr.dbf' 
SIZE 10m
autoextend on next 5m
extent management local;


CREATE TABLESPACE tbs_jack_dept10
DATAFILE 'D:\mytablespace\tbs_jack_dept10.dbf' 
SIZE 10m
autoextend on next 5m
extent management local;


CREATE TABLESPACE tbs_jack_dept11
DATAFILE 'D:\mytablespace\tbs_jack_dept11.dbf' 
SIZE 10m
autoextend on next 5m
extent management local;


CREATE TABLESPACE tbs_jack_dept12
DATAFILE 'D:\mytablespace\tbs_jack_dept12.dbf' 
SIZE 10m
autoextend on next 5m
extent management local;


CREATE TABLESPACE tbs_jack_dept13
DATAFILE 'D:\mytablespace\tbs_jack_dept13.dbf' 
SIZE 10m
autoextend on next 5m
extent management local;


CREATE TABLESPACE tbs_jack_dept14
DATAFILE 'D:\mytablespace\tbs_jack_dept14.dbf' 
SIZE 10m
autoextend on next 5m
extent management local;


CREATE TABLESPACE tbs_jack_dept15
DATAFILE 'D:\mytablespace\tbs_jack_dept15.dbf' 
SIZE 10m
autoextend on next 5m
extent management local;


--创建用户并指定表空间
create user jack identified by test123 
default tablespace tbs_jack_hr;

--切换到jack用户

conn jack/test123;

--建立部门表

create table department
(
   deptId int constraint pk_mydept primary key,
   deptName varchar2(20) not null,
   remark varchar2(55)
)
;

insert into department values(10,'财务部','管理公司财务');
insert into department values(11,'销售部','负责公司销售');
insert into department values(12,'研发部','负责公司技术研发');
insert into department values(13,'后勤部','管理后勤事务');
insert into department values(14,'人事部','管理人力资源');
insert into department values(15,'法务部','负责公司官司');

----假如员工表的数据量很大,我们可以对员工表建立分区表(根据部门编号采用列表分区)
create table employee
(
  empId int constraint p_emp primary key,
  empName varchar2(20) not null ,
  gender char(2) default '男',
  age int constraint ck_age check( age>=18 and age<=60),
  phone char(11) constraint ck_phone check(length(phone)=11),
  email varchar2(30) not null,
  deptIdd int constraint fk_deptIdd references department(deptid)
)
PARTITION BY LIST (deptIdd)

   PARTITION PAR_10 VALUES (10) TABLESPACE tbs_jack_dept10, 
   PARTITION PAR_11 VALUES (11) TABLESPACE tbs_jack_dept11,
   PARTITION PAR_12 VALUES (12) TABLESPACE tbs_jack_dept12,
   PARTITION PAR_13 VALUES (13) TABLESPACE tbs_jack_dept13,
   PARTITION PAR_14 VALUES (14) TABLESPACE tbs_jack_dept14,
   PARTITION PAR_15 VALUES (15) TABLESPACE tbs_jack_dept15
)
;
--插入数据,数据会自动添加到对应的分区中
insert into employee values(1000,'张三','男',23,'12325469854','zs@qq.com',10);
insert into employee values(1001,'李四','男',24,'12375847896','lisi@qq.com',11);
insert into employee values(1002,'王二','男',22,'13725643256','wanger@qq.com',12);
insert into employee values(1003,'麻子','男',32,'13525471456','mazi@qq.com',12);
insert into employee values(1004,'小丽','女',19,'13858478996','xiaoli@126.com',12);
insert into employee values(1005,'小红','女',29,'13102156487','xiaohong@126.com',14);
insert into employee values(1006,'周星星','男',23,'13102156487','zxx@126.com',13);
insert into employee values(1007,'黑猩猩','男',24,'13102156487','hxx@126.com',13);
insert into employee values(1008,'大猩猩','男',26,'13102156487','dxx@126.com',14);
insert into employee values(1009,'刘亦菲','女',21,'13102156487','lyf@126.com',14);
insert into employee values(1010,'范冰冰','女',22,'13102156487','fbb@126.com',15);
insert into employee values(1011,'张靓颖','女',23,'13102156487','zly@126.com',10);

--查询某个分区的数据
select * from employee partition(PAR_15);

--查询表上有多少分区

SELECT * FROM user_TAB_PARTITIONS WHERE TABLE_NAME='EMPLOYEE'


原创粉丝点击