一、分区表的概述:

Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
    分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。

1、分区表的优点:

(1)由于将数据分散到各个分区中,减少了数据损坏的可能性; 
  (2)可以对单独的分区进行备份和恢复; 
  (3)可以将分区映射到不同的物理磁盘上,来分散IO; 
  (4)提高可管理性、可用性和性能。

2、什么时候用分区表

(1) 单表过大,超过一定范围,建议以g计算表,均可考虑用分区
  (2)历史数据据需要剥离的
  (3)查询特征非常明显,比如是按整年、整月或者按某个范围!

3、分区表的类型

1、range分区,按范围
   2、list分区,列举分区
   3、hash分区,根据hash值进行的散列分区
   4、复合分区,9i开始,Oracle就包括了2种复合分区,RANGE-HASH和RANGE-LIST。在11g,Oracle一下就提供了4种复合分区:RANGE-RANGE、LIST-RANGE、LIST-HASH和LIST-LIST。

二、创建分区的举例

1、range分区

create table p_table(
obj_id number(10),
object_id number(10),
object_name varchar2(128),
owner varchar2(30),
object_type varchar2(19),
created date)
partition by range (obj_id)
(partition obj_id1 values less than (20000),
partition obj_id2 values less than (40000),
partition obj_id3 values less than (60000),
partition obj_id4 values less than (80000),
partition obj_id5 values less than (99999));

2、list分区

create table l_table(
obj_id number(10),
object_id number(10),
object_name varchar2(128),
owner varchar2(30),
segment_type varchar2(19),
created date)
partition by LIST(segment_type)
(partition l_type1 values ('LOBINDEX') tablespace my_space1,
 partition l_type2 values ('VIEW') tablespace my_space2,
 partition l_type3 values ('TABLE') tablespace my_space2);

3、hash分区
create table h_table(
obj_id number(10),
object_id number(10),
object_name varchar2(128),
owner varchar2(30),
object_type varchar2(19),
created date)
partition by hash(object_id)
( partition h_objid1,
 partition h_objid2,
 partition h_objid3,
 partition h_objid4);

4、复合分区

Oracle11g一下就提供了4种复合分区:RANGE-RANGE、LIST-RANGE、LIST-HASH和LIST-LIST。

4.1range-range

CREATE TABLE r_r_table(
obj_id number(10),
object_id number(10),
object_name varchar2(128),
owner varchar2(30),
object_type varchar2(19),
created date)
PARTITION BY RANGE (CREATED)
SUBPARTITION BY RANGE (obj_id)
(PARTITION p_level1_1 VALUES LESS THAN (TO_DATE('2013-04-01','YYYY-MM-DD'))
(
SUBPARTITION p_level2_1 VALUES LESS THAN (40000),
SUBPARTITION p_level2_2 VALUES LESS THAN (80000),
SUBPARTITION p_level2_3 VALUES LESS THAN (maxvalue)
 ),
 PARTITION p_level1_2 VALUES LESS THAN (TO_DATE('2013-07-1', 'YYYY-MM-DD'))
(
SUBPARTITION p_level2_4 VALUES LESS THAN (40000),
SUBPARTITION p_level2_5 VALUES LESS THAN (80000),
SUBPARTITION p_level2_6 VALUES LESS THAN (maxvalue)
 ),
 PARTITION p_level1_3 VALUES LESS THAN (TO_DATE('2013-10-1', 'YYYY-MM-DD'))
(
SUBPARTITION p_level2_7 VALUES LESS THAN (40000),
SUBPARTITION p_level2_8 VALUES LESS THAN (80000),
SUBPARTITION p_level2_9 VALUES LESS THAN (maxvalue)
 )
 );

--注意,如果加了maxvalue,那么就不能add的方式添加分区了!

5、11g自动分区技术

CREATE TABLE auto_partition (
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(128),
CREATED DATE)
PARTITION BY RANGE (CREATED)
INTERVAL(NUMTOYMINTERVAL(1, 'month'))
(PARTITION P0 VALUES LESS THAN (TO_DATE('1-1-2011', 'dd-mm-yyyy')));

这样,就会每个月系统自动生成一个分区

--INTERVAL (NUMTODSINTERVAL(1,'day'))   表示每天
--INTERVAL (NUMTOYMINTERVAL(1,'YEAR'))   表示每年

三、分区操作

--添加分区

添加分区
ALTER TABLE mytest ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));

添加子分区
alter table mytest modify partition p3 add subpartition values less than(TO_DATE('2003-06-01','YYYY-MM-DD'));

说明:如果采用了maxvalue,则不能用add,而应该采用split

--删除分区

删除分区
ALTER TABLE mytest DROP PARTITION P3;

删除子分区
ALTER TABLE mytest DROP SUBPARTITION P4SUB1;

说明,如果表只剩下一个分区了,则不能drop,而应该drop表。在复合分区中,如果一个分区只剩下一个子分区,也不能drop

--truncate 分区

truncate分区
ALTER TABLE mytest TRUNCATE PARTITION P2;

truncate子分区

ALTER TABLE mytest TRUNCATE SUBPARTITION P2SUB1;

--合并分区

ALTER TABLE mytest MERGE PARTITIONS P1,P2 INTO PARTITION P2;

注意:不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并

--拆分分区

ALTER TABLE mytest split PARTITION P2 AT(TO_DATE('2013-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);

--接合分区

ALTER TABLE mytest COALESCA PARTITION;

说明:这个只能用于hash分区

--重命名分区

ALTER TABLE mytest RENAME PARTITION P21 TO P2;

--分区表的查询

SQL> select * from r_r_table subpartition(p_level2_1);       --查询子分区

no rows selected

SQL> select * from r_r_table partition(p_level1_1);          --查询分区

no rows selected

--分区表索引重建

Alter index ind_mytest rebuild partition p1 ;

alter index ind_created_test rebuild subpartition p_level2_5 online;

五、性能比较

SQL> set autot trace exp;
SQL> set linesize 400;

5.1非并行下的表范围扫描

--分区表扫描的执行计划

SQL> select * from penggj.p_table where obj_id between 10000 and 30000;

Execution Plan
----------------------------------------------------------
Plan hash value: 1095083444

----------------------------------------------------------------------------------------------------
| Id  | Operation                | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |         | 14865 |  1872K|    99   (8)| 00:00:02 |       |       |
|   1 |  PARTITION RANGE ITERATOR|         | 14865 |  1872K|    99   (8)| 00:00:02 |     1 |     2 |
|*  2 |   TABLE ACCESS FULL      | P_TABLE | 14865 |  1872K|    99   (8)| 00:00:02 |     1 |     2 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("OBJ_ID">=10000 AND "OBJ_ID"<=30000)

Note
-----
   - dynamic sampling used for this statement (level=2)

--普通表全表扫描的执行计划

SQL> select * from penggj.n_table where obj_id between 10000 and 30000;

Execution Plan
----------------------------------------------------------
Plan hash value: 2316247272

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         | 22714 |  2861K|   193   (2)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| N_TABLE | 22714 |  2861K|   193   (2)| 00:00:03 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("OBJ_ID">=10000 AND "OBJ_ID"<=30000)

Note
-----
   - dynamic sampling used for this statement (level=2)

说明:从上面两个查询的执行计划来看分区表效率更高,因为在整个扫描过程中,分区表只扫描了两个分区,而普通表进行了全表扫描!

5.1并行下的表范围扫描

--分区表范围扫描

SQL> select /*+ parallel(p_table,4)*/ * from penggj.p_table where obj_id between 10000 and 30000;

Execution Plan
----------------------------------------------------------
Plan hash value: 2269943597

------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |          | 14865 |  1872K|    27   (4)| 00:00:01 |       |       |        |      |            |
|   1 |  PX COORDINATOR      |          |       |       |            |          |       |       |        |      |            |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 | 14865 |  1872K|    27   (4)| 00:00:01 |       |       |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR |          | 14865 |  1872K|    27   (4)| 00:00:01 |     1 |     2 |  Q1,00 | PCWC |            |
|*  4 |     TABLE ACCESS FULL| P_TABLE  | 14865 |  1872K|    27   (4)| 00:00:01 |     1 |     2 |  Q1,00 | PCWP |            |
------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

4 - filter("OBJ_ID">=10000 AND "OBJ_ID"<=30000)

Note
-----
   - dynamic sampling used for this statement (level=2)

--普通表采用并行的方式进行

SQL> select /*+ parallel(p_table,4)*/ * from penggj.n_table where obj_id between 10000 and 30000;

Execution Plan
----------------------------------------------------------
Plan hash value: 2316247272

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         | 22714 |  2861K|   193   (2)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| N_TABLE | 22714 |  2861K|   193   (2)| 00:00:03 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("OBJ_ID">=10000 AND "OBJ_ID"<=30000)

Note
-----
   - dynamic sampling used for this statement (level=2)

比较可以看到分区表采用并行的方式,其存在明显的性能优势!

oracle 分区表详解的更多相关文章

  1. 【转载】oracle 分区表详解

    一.分区表的概述:     Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见 ...

  2. oracle partition table 分区表详解

    Oracle partition table 分区表详解 分区表就是通过使用分区技术,将一张大表,拆分成多个表分区(独立的segment),从而提升数据访问的性能,以及日常的可维护性.分区表中,每个分 ...

  3. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  4. oracle 序列 详解

    序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l  自动提供唯一的数值 l  共享对象 l  主要用于提供主键值 l  将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建 ...

  5. oracle checkpoint 详解

    Oracle checkpoint详解 topcheckpoint扫盲 top什么是checkpoint 在数据库系统中,写日志和写数据文件是数据库中IO消耗最大的两种操作,在这两种操作中写数据文件属 ...

  6. Oracle数据字典详解

    学习笔记:oracle数据字典详解 --- 本文为TTT学习笔记,首先介绍数据字典及查看方法,然后分类总结各类数据字典的表和视图.然后列出一些附例.   数据字典系统表,保存在system表空间中. ...

  7. oracle rowid 详解

    oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...

  8. Oracle索引详解

    Oracle索引详解(二) --索引分类   Oracle 提供了大量索引选项.知道在给定条件下使用哪个选项对于一个程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程 ...

  9. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

随机推荐

  1. onSaveInstanceState

    我们已经分析过Activity的启动流程,从中也分析了Activity的生命周期.而其中有一个生命周期方法:onSaveInstanceState方法,今天我们主要讲解一下onSaveInstance ...

  2. zoj3686(线段树的区间更新)

    对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a ...

  3. 【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治

    [BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 ...

  4. vscode中设置自动保存

  5. 巨蟒python全栈开发flask13项目开始5

    1.Toy回复App消息 2.离线维度消息数量存储 3.Toy批量收取消息 4.Toy主动发起消息&&AI对接 5.Toy_info 1.Toy回复App消息 2.离线维度消息数量存储 ...

  6. 【推荐】CentOS安装Subversion-1.8.17+HTTP协议支持配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. 我们需要搭建一个自己的SVN服务器. 此外,搭建好的SVN服务器除了需要支持svn协议外,最好还需要支持HTTP协议和HTTPS协 ...

  7. Storm-源码分析-EventManager (backtype.storm.event)

    Protocol and DataType 大体结构, 定义protocol EventManager, 其实就是定义interface 函数event-manager, 主要做2件事 1. 启动ev ...

  8. 使用python的logging模块(转)

    一.从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 创建一个logger logger = logging.getLogger(' ...

  9. 0604-Zuul构建API Gateway-Zuul的回退

    一.概述 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#hystrix-f ...

  10. ALV tree标准DEMO

    BCALV_TREE_01 ALV 树控制:构建层次树 BCALV_TREE_02 ALV 树控制:事件处理 BCALV_TREE_03 ALV 树控制:使用自己的上下文菜单 BCALV_TREE_0 ...