Partitioning enables you to decompose very large tables and indexes into smaller and more manageable pieces called partitions. Each partition is an independent object with its own name and optionally its own storage characteristics.

Oracle允许用户将大表以及大的索引拆分成小块,每一块都是一个单独的对象,称为分区,分区技术可以用于提高查询及DML性能、以及更便捷地管理数据。

1.  分区表

1.1.  分区表主要包括三种:

Range Partitioning

List Partitioning

Hash partitioning

1.2. 分区表创建语法示例(Range分区):

CREATE TABLE tab_part_0309(val DATE, val2 VARCHAR2(200))PARTITION BY RANGE(val)(  PARTITION p1 VALUES LESS THAN (TO_DATE('20120308','yyyymmdd')));

1.3. ORA-14400错误

如果在插入数据时Oracle无法找到合适的分区,就会产生ORA-14400错误,”inserted partition key does not map to any partition”。例如(假设当前为2012-03-09):

INSERT INTO tab_part_0309 VALUES(SYSDATE,'abrownfox');

1.4. 如何添加分区

ALTER TABLE tab_part_0309 ADD PARTITION p2 VALUES LESS THAN (TO_DATE('20120309','yyyymmdd'));ALTER TABLE tab_part_0309 ADD PARTITION p3 VALUES LESS THAN (TO_DATE('20120310','yyyymmdd'));

1.5. 查询

SELECT * FROM tab_part_0309 PARTITION(p3);

查询时我们可以指定分区。不过更常见的是Oracle自动的Partition Pruning,即如果查询时Where子句中包括用于分区的列(示例中的val列),Oracle会自动定位分区,而不用我们手工指定分区。

1.6. 删除分区

ALTER TABLE tab_part_0309 DROP PARTITION p3;

1.7. MAXVALUE

一些情况下,我们会通过定时任务(Scheduler)来定期创建分区,这时候我们需要考虑一个问题,如果定时任务失败了导致分区没有建立, 那么后斯的数据插入就会遇到ORA-14400错误。有一种方法可以避免这种错误,使用MAXVALUE:

CREATE TABLE tab_part_0309_2(val DATE, val2 VARCHAR2(200))PARTITION BY RANGE(val)(  PARTITION p1 VALUES LESS THAN (TO_DATE('20120308','yyyymmdd')),  PARTITION pm VALUES LESS THAN (MAXVALUE));

使用MAXVALUE后,无法再添加新的分区:

ALTER TABLE tab_part_0309_2 ADD PARTITION p2 VALUES LESS THAN (TO_DATE('20120310','yyyymmdd'))ORA-14074, partition bound must be collate higher than that of the last partition

但是我们可以从pm分区中进行拆分:

ALTER TABLE tab_part_0309_2  SPLIT PARTITION pm AT (TO_DATE('20120310','yyyymmdd'))INTO (PARTITION p2, PARTITION pm)

这样的好处是,即便执行拆分的定时任务失败了,数据仍然可以正常插入(只不过进入了pm分区)。同时,发现错误后,我们可以进行补救,手工拆分出一个分区,这样,pm中符合新分区条件的数据,会自动进行新的分区。

1.8. Interval partitioning

11G中引入了一个更为强大的分区机制:Interval partitioning,可以按一定条件自动创建分区。创建语法是这样的:

CREATE TABLE tab_part_0309_3(val DATE, val2 VARCHAR2(200))PARTITION BY RANGE(val)INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))(  PARTITION p1 VALUES LESS THAN (TO_DATE('20120308','yyyymmdd')));

Interval分区表必须指定一个根分区(上例的p1),使用Interval指定分区的间隔,它使用了NumToYMInterval函数,该函数第一个参数是number,后一个是单位,包括’MONTH’, ‘YEAR’,上例表示间隔为一个月,目前看一个月应该是最小的间隔了,你可以指定0.5或者0.3,但最终的效果还是一个月。

假设当前时间为2012-03-09,执行下述语句

INSERT INTO tab_part_0309_3 VALUES(SYSDATE, 'abrownfox');

1)             导致自动创建新分区

2)             分区字段值为2012-04-08,是从根分区往后的一个月时间。

3)             分区名称自动生成,如SYS_P21

4)             如果插入的时间在两个月以后或者更久,则Oracle只生成必须的分区,并不会生成连续分区。例如insert的时间是2012-06-01,则只会生成2012-06-08分区,至于中间的2012-05-08,2012-04-08分区并不生成。

2. 分区索引

跟表一样,索引也分为普通索引与文艺索引(就当分区索引比较文艺一点吧)。可以为一张普通表创建分区索引(不过不能创建Local分区索引,后面解释),也可以为一张分区表创建普通索引。

2.1. 分区索引分两类

全局分区索引(global partitioning index)

本地分区索引(local partitioning index)

2.2. 全局分区索引

与表的分区没有关系,创建索引时可以指定任意的列作为索引分区的Key,创建语法如下:

CREATE TABLE tab_part_0321_2(val DATE, val2 NUMBER)PARTITION BY RANGE(val)(  PARTITION p1 VALUES LESS THAN (TO_DATE('20120308','yyyymmdd')));

CREATE INDEX tab_part_0321_2_idx ON tab_part_0321_2 (val2)   GLOBAL PARTITION BY RANGE (val2)      (PARTITION p1 VALUES LESS THAN (2),       PARTITION p2 VALUES LESS THAN (3),       PARTITION p3 VALUES LESS THAN (MAXVALUE));

注意这里使用了global关键字, 并且索引分区使用的Key是val2字段,而不是表分区使用的val字段。

那么是否可以在为字段val2创建索引但是使用val字段作为分区的key呢?

CREATE INDEX tab_part_0321_2_idx2 ON tab_part_0321_2 (val2)   GLOBAL PARTITION BY RANGE (val)      (PARTITION pa VALUES LESS THAN (to_date('20120308','yyyymmdd')),       PARTITION pb VALUES LESS THAN (to_date('20120408','yyyymmdd')),       PARTITION pc VALUES LESS THAN (MAXVALUE));ORA-14038 global partitioned index must be prefixed.

Prefixed即“前缀索引”,指索引键与分区键是相同的,Oracle无法创建非前缀的全局分区索引。

2.3. 本地分区索引

只有分区表才能创建本地分区索引,本地分区索引始终使用与分区表相同的字段进行分区(不需要partition by子句),因此索引的分区与表的分区是一一对应的。我们看看语法:

CREATE INDEX tab_part_0321_2_idx3 ON tab_part_0321_2 (val) LOCAL

尝试:

CREATE INDEX tab_part_0321_2_idx4 ON tab_part_0321_2 (val2) LOCALORA-01408 such column list already indexed

这是因为在前一小节我们在这个列上创建过索引了,我们回去把tab_part_0321_2_idx移除,重新执行上面的语句便可创建成功,这说明跟global分区索引不同,local分区索引允许创建“非前缀索引”。

注:关于前面提到的本地前缀索引(local prefixed index)与本地非前缀索引(local non-prefixed index)的概念,有兴趣的可以看看OTN的一些讨论帖子,比如:https://forums.oracle.com/forums/thread.jspa?threadID=2150455&start=0&tstart=0

转载于:https://www.cnblogs.com/morvenhuang/archive/2012/03/22/2411861.html

ORACLE HANDBOOK系列之十一:分区(Partition)相关推荐

  1. ORACLE HANDBOOK系列之六:ODP.NET与复杂的PL/SQL数据类型(Using ODP.NET To Deal With Complex PLSQL Data Types)...

    在开始介绍之前,先给出文章里用到的所有PL/SQL代码: (类型定义) CREATE OR REPLACE TYPE T_Nested_Tab_Str IS TABLE OF VARCHAR2(25) ...

  2. ORACLE HANDBOOK系列之十四:变化通知(Change Notification)

    在App开发的过程中,有些数据访问频率很高但是数据变化不大,我们一般会让它驻留内存以提高访问性能,但是此种机制存在一个问题,那就是如何监测数据的变化,Oracle 10g中引入的 Change Not ...

  3. ORACLE HANDBOOK系列之九:时间与时区(Time and Time Zone)

    一) Oracle中的四种时间类型 Date Timestamp Timestamp with local time zone Timestamp with time zone 这四种类型中,前两个与 ...

  4. ORACLE HANDBOOK系列之十:字符集、编码以及Oracle的那些事

    第一部分字符集与编码常识 字符集: 人们根据需要把某些字符收集到一处,并赋以名称,于是便有了某某字符集. 编码: 当前面收集的工作完成以后,为了让只认识数字的"愚蠢"的计算机也能够 ...

  5. 聊聊分区Partition——我们为什么要分区(上)

    一直想系统的聊聊分区.网络上Oracle技术中,讨论的最多的话题之一就是Partition.各种分区类型.分区组合和随之而来的各种优缺点,一直被大家讨论.但是,实际中,我们往往看到很多以偏概全.舍本逐 ...

  6. Linux系列之fdisk 分区挂盘

    2019/3/28 星期四 Linux系列之fdisk 分区挂盘 [root@hadoop04-184 ~]# df -Th Filesystem Type Size Used Avail Use% ...

  7. mysql 40014无效,Oracle问题-ORA-14400:插入的分区关键字未映射到任何分区

    Oracle 问题-ORA-14400: 插入的分区关键字未映射到任何分区 在执行一次SQL数据导入时报:ORA-14400: 插入的分区关键字未映射到任何分区 具体内容如下: SQL> @&q ...

  8. [1183]Clickhouse数据表数据分区partition数据生命周期操作

    文章目录 表操作 创建数据库 创建表 删除表 清空表 删除表某个分区 重命名或移动数据表 表字段column操作 添加字段 删除字段 修改字段 修改字段名称 数据分区partition的基本操作 查询 ...

  9. Oracle怎么新增删除表分区

    目录 一.Oracle分区简介 二.Oracle分区优缺点 三.oracle删除分区数据 方法1:通过删除分区的方式 方法2:清数据 四.分区表的种类及创建分区 1.RANGE 范围分区 2.LIST ...

最新文章

  1. F - Tmutarakan Exams URAL - 1091 -莫比乌斯函数-容斥 or DP计数
  2. gaia引擎分析(二)场景管理
  3. 第三天2017/03/30(上午:二级指针的(输入)内存模型:(共三种模型))
  4. TF之LSTM:利用LSTM算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)
  5. 使用subgit进行svn迁移至git(branch,tags)
  6. 软件测试c语言代码_软件测试理论知多少?
  7. Leetcode每日一题:767.reorganize-string(重构字符串)
  8. 场景7:带有Linux网桥的提供商网络
  9. 复习:关于类的继承和构造函数
  10. 非参数统计:方法与应用(全书例题R语言实现)
  11. 飘动图片广告html代码,基于JavaScript代码实现随机漂浮图片广告
  12. 【Python】判断多边形的形状为凸多边形还是凹多边形
  13. python字典里存字符_python基础知识(三)字典、字符串
  14. 实用主义当道——GitHub 热点速览 Vol.48
  15. 更改浏览器语言(firefox, chrome)详细步骤
  16. maven手册(转)
  17. 用Eclipse读取excel中全部数据
  18. HTC M8t unlock Bootloader/Root/S-OFF/解网络锁笔记
  19. Facial Emotion Recognition: State of the Art Performance on FER2013
  20. 【物联网】LoRa vs NBIoT

热门文章

  1. (二十)深入浅出TCPIP之epoll的一些思考
  2. 《Python Cookbook 3rd》笔记(2.17):在字符串中处理html和xml
  3. struts2通配符_基于Struts2框架的名片管理系统
  4. Linux加密框架 crypto RC4
  5. 加密机组会 会议纪要
  6. Windows下的FFmpeg 、MEncoder、MPlayer下载地址
  7. java.lang.UnsupportedOperationException 异常分析
  8. IPC 中 LPC、RPC 的区别和联系
  9. 【Python web 开发】viewset 实现商品详情页的接口
  10. python -m xxx.py和python xxx.py的区别