Oracle 表分区(Partition)

  表分区功能能够改善应用程序性能,提高数据库可管理性和可用性,是数据库管理非常关键的技术。数据库通过使用分区提高查询性能,简化日常管理维护工作。

  1 分区优点

  1) 减少维护工作量,独立管理每个表分区比管理整个大表要轻松的多

  2) 增加数据库的可用性,由于将数据分散到各个分区中,减少了数据损坏的可能性

  3) 均衡I/O,减少竞争,通过把表的不同分区分配到不同的磁盘来平衡I/O改善性能

  4) 分区对用户保持透明,用户感受不到它的存在

  5) 提高查询速度,对于大表的DML操作可以分解到表的不同分区来执行,可以加快执行速度

  

  2 分区缺点

  已经存在的表,不能直接转化为分区表

  3 什么时候使用分区表

1) 表的大小超过2GB

2) 表中包含历史数据,新的数据被增加到新的分区中

4 分区类型

1) Range 分区

2) HASH分区(散列分区)

3) 列表分区

4) 组合分区(复合分区)

1) Range Partition

Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。

如按照时间划分,2017年第一季度的数据放到第一分区,二季度的数据放到第二分区,在创建的时候,需要指定基于的列,以及分区的范围值。在按时间分区时, 如果某些记录暂无法预测范围,可以创建 maxvalue 分区,所有不在指定范围内的记录都会被存储到 maxvalue 所在分区中。

假设有一个emp表,表中有数据200000行,我们将此表通过hire_date进行分区,每个分区存储50000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:

create table emp_range
(
empno number not null primary key,
deptno number not null,
first_name varchar2(30) not null,
last_name varchar2(30) not null,
status char(1),
hire_date date not null
)
partition by range(hire_date)
(
partition hire_part1 values less than(to_date(‘2017-04-01‘,‘yyyy-mm-dd‘)) tablespace emp_space01,
partition hire_part2 values less than(to_date(‘2017-07-01‘,‘yyyy-mm-dd‘)) tablespace emp_space02,
partition hire_part3 values less than(to_date(‘2017-10-01‘,‘yyyy-mm-dd‘)) tablespace emp_space03,
partition hire_part4 values less than(to_date(‘2018-01-01‘,‘yyyy-mm-dd‘)) tablespace emp_space04
);

测试数据

insert into emp_range(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 10,‘latiny1‘,‘liu‘,‘1‘, to_date(‘2017-01-02‘,‘yyyy-mm-dd‘));

insert into emp_range(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 20,‘latiny2‘,‘liu2‘,‘1‘, to_date(‘2017-04-02‘,‘yyyy-mm-dd‘));

insert into emp_range(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 30,‘latiny3‘,‘liu3‘,‘1‘, to_date(‘2017-07-02‘,‘yyyy-mm-dd‘));

insert into emp_range(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 40,‘latiny4‘,‘liu4‘,‘1‘, to_date(‘2017-10-02‘,‘yyyy-mm-dd‘));

按分区查询结果

select *
from emp_range partition(hire_part1);

2) HASH分区

散列分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

drop table emp_hash;
create table emp_hash
(
empno number not null primary key,
deptno number not null,
first_name varchar2(30) not null,
last_name varchar2(30) not null,
status char(1),
hire_date date not null
)
partition by hash(deptno)
(
partition dep_part1 tablespace emp_space01,
partition dep_part2 tablespace emp_space02,
partition dep_part3 tablespace emp_space03
);

insert into emp_hash(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 10,‘latiny1‘,‘liu‘,‘1‘, to_date(‘2017-01-02‘,‘yyyy-mm-dd‘));

insert into emp_hash(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 20,‘latiny2‘,‘liu2‘,‘1‘, to_date(‘2017-04-02‘,‘yyyy-mm-dd‘));

insert into emp_hash(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 30,‘latiny3‘,‘liu3‘,‘1‘, to_date(‘2017-07-02‘,‘yyyy-mm-dd‘));

insert into emp_hash(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 40,‘latiny4‘,‘liu4‘,‘1‘, to_date(‘2017-10-02‘,‘yyyy-mm-dd‘));

insert into emp_hash(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 50,‘latiny5‘,‘liu5‘,‘1‘, to_date(‘2017-11-02‘,‘yyyy-mm-dd‘));

insert into emp_hash(empno, deptno, first_name, last_name, status, hire_date)
values (seq_par_id.nextval, 60,‘latiny6‘,‘liu6‘,‘1‘, to_date(‘2017-08-02‘,‘yyyy-mm-dd‘));

select *
from emp_hash partition(dep_part1);

散列分区最主要的机制是根据Hash算法来计算具体某条纪录应该插入到哪个分区中, Hash算法中最重要的是Hash函数,Oracle中如果你要使用Hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

3) 列表分区

该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

create table emp
(
empno number not null primary key,
deptno number not null,
first_name varchar2(30) not null,
last_name varchar2(30) not null,
status char(1),
hire_date date not null
)
partition by list(status)
(
partition status_active values (‘active‘) tablespace emp_ls01,
partition status_inactive values (‘inactive‘) tablespace emp_ls02
)

4) 组合分区

范围--散列分区

这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

create table emp
(
empno number not null primary key,
deptno number not null,
first_name varchar2(30) not null,
last_name varchar2(30) not null,
status char(1),
hire_date date not null
)
partition by range(hire_date)subpartition by hash(deptno) subpartitions 4 store in (emp_space01,emp_space02,emp_space03,emp_space04)
(
partition part_01 values less than(to_date(‘2017-01-01‘,’yyyy-mm-dd’)),
partition part_02 values less than(to_date(‘2017-04-01‘,’yyyy-mm-dd’)),
partition part_03 values less than(to_date(‘2017-07-01‘,’yyyy-mm-dd’)),
partition part_04 values less than(to_date(‘2017-10-01‘,’yyyy-mm-dd’))
);

范围--列表分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

create table emp
(
empno number not null primary key,
deptno number not null,
first_name varchar2(30) not null,
last_name varchar2(30) not null,
status char(1),
hire_date date not null
)
partition by range(hire_date)subpartition by list(status)
(
partition part_01 values less than(to_date(‘2017-01-01‘,’yyyy-mm-dd’)) tablespace emp_space01
(
subpartition p1sub1 values (‘1‘) tablespace emp_space01,
subpartition p1sub2 values (‘0‘) tablespace emp_space01

),
partition part_02 values less than(to_date(‘2017-04-01‘,’yyyy-mm-dd’)) tablespace emp_space02
(
subpartition p2sub1 values (‘1‘) tablespace emp_space02,
subpartition p2sub2 values (‘0‘) tablespace emp_space02
)
);

时间: 2024-10-10 22:32:49

Oracle 表分区(Partition)的相关文章

Oracle 表分区partition(http://love-flying-snow.iteye.com/blog/573303)

http://www.jb51.net/article/44959.htm Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: Sql代码   create table graderecord ( sno varchar2(10), sname varchar2(20), dormitory varchar2(3), grade int ) partition by range(grade) ( partit

oracle 表分区例子

oracle表分区详解-一步一步教你oracle分区表详解   1.创建三个不同的表空间,模拟在不同磁盘上的保存不同范围的数据    create tablespace test01 datafile '/u01/app/oracle/oradata/orcl02/test01.dbf' size 500m; ---数据文件可以不再同一存储上  create tablespace test02 datafile '/u01/app/oracle/oradata/orcl02/test02.dbf

oracle表分区与索引分区

今天是2016年4月13号,清晨据说是50年来深圳最大的雨把我给吵醒了,上午腾讯新闻弹出新闻说这是谣言~!我信了~! 今天把tiptop的一个功能实现了~心情还不错.不瞎扯了,今天开始学习oracle表分区和索引分区!坚持就是胜利~ oracle是支持物理分区的数据库管理系统,据说是最早支持的!优点如下 1:减少维护工作量,独立管理每个分区比管理大的单分区简单 2:数据可用性增强,一个分区坏了不影响所有数据 3:提高查询速度 4:均衡I/O 创建表分区 create table ware_ret

转:Oracle表分区

Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: 1. create table graderecord 2. ( 3. sno varchar2(10), 4. sname varchar2(20), 5. dormitory varchar2(3), 6. grade int 7. ) 8. partition by range(grade) 9. ( 10. partition bujige valu

Oracle表分区[转]

废话少说,直接讲分区语法. Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: Sql代码 create table graderecord ( sno varchar2(10), sname varchar2(20), dormitory varchar2(3), grade int ) partition by range(grade) ( partition bujige values less tha

oracle表分区、表分析及oracle数据泵文件导入导出开心版

1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到要的那个打开,嘿嘿,我们得找到什么时候. 这时候,有个人告诉你,你把文件按照特定的规律存在不同的文件夹中,这样的话你就会好找很多. 哇,突然你开窍了,你说,对啊,你好牛逼啊,我怎么没想到呢?分开之后我在找的话就会快很多啊,所以你很高兴,也很服他.于是你就开始做了. --这个不同的文件夹就是不同的分区

oracle表分区详解(按天、按月、按年等)

分区表的概念:  当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表. 分区表的优点: 1)   改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度. 2)   增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用: 3)   维护方便:如果表的某个分区出现故障,需要修复数据,只修复

Oracle 表分区

从以下几个方面来整理关于分区表的概念及操作: 表空间及分区表的概念 表分区的具体作用 表分区的优缺点 表分区的几种类型及操作方法 对表分区的维护性操作 1.表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间. 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),

oracle表分区详解

从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间. 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表. 2.表分区的具体作用 Oracle的表分区功能通过改善可管理性.