Oracle 分区概述

     一. 概念

      分区是将一个表或者索引物理地分解成多个更小的部分。对于访问数据库的应用来看,逻辑上看只有一个表或者索引,因为访问和普通表或索引一模一样。但物理上这个表可能被分成了数十个独立的分区,每一个分区都是独立的对象,可以独自处理。

      二. 如何区分数据

     分区主要有利于非常大的表和索引,将一个大表或者索引分成很多独立的小部分更容易进行处理。那么按照什么样的规则将数据进行分区?换言之,你怎么知道这条数据放A分区,那条数据放B分区。oracle中是根据分区键决定的,分区键有可能是通过某一个函数算出来的。

      三. 分区的好处

      1. 提高数据的可用性

      这个很容易理解,数据被分成了多个独立的部分,假如某一分区的数据出现问题,不会影响整个数据的访问。因为假如我这次访问的数据不在这个问题分区,还是可以正常执行。

     为了展示这种可用性的提高,我们将建立一个散列分区表,其中有两个分区,分别在单独的表空间中。这里将创建一个EMP表,它在EMPNO列上指定了一个分区键(EMPNO就是我们的分区键)SQL如下:  

create table emp 
(empno int,
 ename varchar2(20)
 )
 partition by hash(empno)
 (partition part_1 tablespace nnc_data01,
  partition part_2 tablespace nnc_data02
  );
  insert into emp select empno, ename from scott.emp;
  select * from emp partition(part_1);
  select * from emp partition(part_2);

     我们会看到最后两个查询会查到两个分区都有数据,而且数据是随机地分布在每个分区上,没有什么规律。这主要采用的是散列分区方式,通过计算empno的散列值来确定将数据放在哪个分区。接着运行如下sql语句:

alter tablespace p1 offline;
select * from emp;
variable n number
exec :n := 7844;
select * from emp where empno = :n;

      我们会看到最后一条查询语句能够执行成功,第二条查询语句执行失败。因为第二条查询语句需要访问分区p1,但是p1已经不可访问。最后一条查询语句只要访问p2分区,故p1分区可以不可以访问不会影响它的执行。

     另外,分区还可以通过减少停机时间来提高可用性。例如,如果有一个100GB的表,它划分为50个2GB的分区,这样就能更快地从错误中恢复。如果某个2GB的分区遭到破坏,现在恢复的时间就只是恢复一个2GB分区所需的时间,而不是恢复一个100GB表的时间。

     2. 减少管理负担

     这是因为与在一个大对象上执行操作相比,在小对象上执行同样的操作从本质上讲更为容易、速度更快,而且占用的资源也更少。

     例如,假设数据库中有一个10GB的索引。如果需要重建这个索引,而该索引未分区,你就必须将整个10GB的索引作为一个工作单元来重建。尽管可以在线地重建索引,但是要完全重建完整的10GB索引,还是需要占用大量的资源。至少需要在某处有10GB的空闲存储空间来存放两个索引的副本,还需要一个临时事务日志表来记录重建索引期间对基表所做的修改。另一方面,如果将索引本身划分为10个1GB的分区,就可以一个接一个地单独重建各个索引分区。现在只需要原先所需空闲空间的10%。另外请考虑以下情况:10GB索引的重建即将完成之前,如果出现系统或软件故障会发生什么。我们所做的全部努力都会付诸东流。如果把问题分解,将索引划分为1GB的分区,你最多只会丢掉重建工作的10%。

     3. 改善语句性能

     分区最后一个好处体现在改进语句(SELECT、INSERT、UPDATE、DELETE、MERGE)的性能方面。我们来看两类语句,一种是修改信息的语句,另一种是只读取信息的语句。

     1. 并行的修改语句(DML)

     修改数据库中数据的语句有可能会执行并行DML(parallel DML,PDML)。采用PDML时,Oracle使用多个线程或进程来执行INSERT、UPDATE或DELETE, 而不是执行一个串行进程。在一个有充足I/O带宽的多CPU主机上,对于大规模的DML操作,速度的提升可能相当显著。在Oracle9i以前的版本中,PDML要求必须分区。如果你的表没有分区,在先前的版本中就不能并行地执行这些操作。后续版本放开了限制。

     2. 查询性能

     假如分区了,我们只需要查询感兴趣的分区,不感兴趣的分区就不查了,显然能提高查询速度

猜你喜欢

转载自liwenshui322.iteye.com/blog/1708983