ORACLE HANDBOOK系列之十一:分区(Partition)

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) LOCAL
ORA-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不要错过路边的的风景

人生就像一次旅行。人们总是忙于奔赴目的地,却往往忽略了路边的风景。 随着年龄的增长,人们越来越没有时间去寻求生命中的惊奇和美丽了,他们只在乎地位,财富和权力。大多数人为了不落人后,已经花去了自己大部分时间和精…

复制表、复制表结构、复制数据

完全复制表(含表结构表数据) create table 新表名 as select * from 需要复制的表名; 复制表部分字段和数据 CREATE TABLE 新表名(列1,列2) AS SELECT 列1,列2 FROM OLD_TABLE;复制表结构不…

劝你不要转行

在知乎收到一个咨询,问题如下您好,想向您请教一些问题。想转行做嵌入式工程师个人基本信息29岁,电子与通信工程专业硕士,毕业后就职于某车企,主要从事类似项目管理一职。去年考入某事业单位,业余时间相对较…

STL中的map集合扩展字段比较方便

扩展字段map<string, string>真是个好东西&#xff0c; 在定各种协议时很常用&#xff0c;便于扩展 #include <iostream> #include <map> #include <string> using namespace std; void fun(const map<string, string> &mp) { } …

linux下DHCP的安装配置

今天在整理以前的资料的时候&#xff0c;看到了这篇过去积攒的资料&#xff0c;过程详细所以拿来给大家一块分享&#xff0c;同时我也在做&#xff0c;提高一下熟练度。 【实验名称】Linux下DHCP服务的配置与安装【实验拓扑】【实验目标】了解DHCP服务的工作原理&#xff0c;掌…

在GZIDG弄服务器的这一整夜,快乐

公母服务器: 去到IDG那里,2 台Dell ,一台五舟服务器: 初步给的网站架构,一台Dell服务器作为Web服务器,4cpu,4G内存,相信目前的架构能够满足初期的需要 整个架构做web服务器接公网,五舟服务器也接公网作为文件服务器,数据库做为内网与web服务器接一个端口 一个接…

175. Combine Two Tables

select FirstName, LastName,City, State from Personleft join Address on Person.PersonId Address.PersonId; 转载于:https://www.cnblogs.com/yuesi/p/10134925.html

STL中map的使用要点

我们都知道&#xff0c; 当map不存在某key时&#xff0c; 如果用下标操作&#xff0c; 便会产生新key。 因此&#xff0c; 要特别注意 #include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, s…

浅谈一下嵌入式中的强符号和弱符号

__attribute__ 是一个编译器指令&#xff0c;其实是 GNU C 的一种机制&#xff0c;本质是一个编译器的指令&#xff0c;在声明的时候可以提供一些属性&#xff0c;在编译阶段起作用&#xff0c;来做多样化的错误检查和高级优化。用于在 C、C、Objective-C 中修饰变量、函数、参…

web前端开发之div+css教程精华收集二

11个让你代码整洁的原则http://www.xinran001.com/bbs/thread-73231-1-1.html HTML 实体字符http://www.xinran001.com/bbs/thread-256-1-1.html你真的了解HTML吗http://www.xinran001.com/bbs/thread-7258-1-1.html当inline-block和text-indent遇到IE6,IE7http://www.xinran00…

POJ_1862 Stripies 【贪心】

一、题面 POJ1862 二、分析 反省一下&#xff0c;自己英语水平着实不行&#xff0c;该题其实就是问若给出若干个这种生物&#xff0c;根据这种体重变换方式&#xff0c;最终合并成一个后&#xff0c;体重最少是多少。根据公式 $m 2\sqrt{m_{1}m_{2}}$ 我们可以发现&#xff0c…

C++ string assign()赋值常用方法

C string assign()赋值常用方法 函数assign()常用在给string类变量赋值. 常用方法有: 1,直接用另一个字符串赋值. 如str2.assign(str1);即用str1给str2赋值. 2,用另一个字符串的一个子串赋值 如str3.assign(str1, 2, 3); 3,用一个字符串的前一段子串赋值; 如str4.assign("…

SEO技巧:好的域名是网站成功的开始

很多人都知道做网站可以赚钱&#xff0c;所以很多懂一些网络技术的就开始制作自己的站点了。制作网站的开端&#xff0c;如果不是为了自己的兴趣&#xff0c;而是纯粹为了赚钱&#xff0c;那么如何把握和选择网站内容的主体和方向&#xff0c;往往就会成为令人头疼的一件事情。…

想成为硬件工程师,难不?

有很多朋友经常会问&#xff0c;成为高级嵌入式系统硬件工程师&#xff0c;需要做到哪些呢?那么&#xff0c;我们就先从嵌入式硬件工程师是个什么概念入手。一、如何理解“嵌入式”的概念呢?1、从硬件上&#xff0c;将基于CPU的处围器件&#xff0c;整合到CPU芯片内部&#x…

.Net/C#中Cache的用法

Cache 即高速缓存&#xff0c;使用合理可以提高网站访问速度&#xff0c;减少服务器压力 什么是缓存&#xff1f;Web 应用程序通常都是被多个用户访问。一个Web站点可能存在一个“重量级”的加载&#xff0c;它能够使得站点在访问的时候&#xff0c;拖慢整个服务器。当站点被大…

Maven继承

继承为了消除重复&#xff0c;可以把pom 中很多相同的配置提取出来&#xff1b;如&#xff1a;grouptId&#xff0c; version 等。 在使用的时候子工程直接继承父工程的依赖版本号&#xff0c;子工程中不再需要指定具体版本号&#xff0c;方便统一管控项目的依赖版本问题。 创建…

STL中vectortype的复制

STL vector的复制 #include <iostream> #include <vector> using namespace std; int main() { vector<unsigned int> v1, v2; v1.push_back(11); v1.push_back(44); v2 v1; cout << v2[1] <<…

FLEXAIR 界面展示。

http://www.scalenine.com/showcase.php 希望自己做的AIR程序更漂亮&#xff0c;有更好的体验么&#xff1f;请参考。 转载于:https://www.cnblogs.com/xxcainiao/archive/2008/04/27/1173520.html

C++中关于cons和字符串t的一些注意事项

1&#xff0c;关于const的一些基本概念 const char * p1;//p1指向的内容不可变 char const * p2;//p2指向的内容不可变 char * const p3;//p3不可变&#xff0c;但其指向的内容可变 2&#xff0c;字符串的函数返回值不能再函数体里面声明创建&#xff0c;最好是函数传参进去&am…

电子驱蚊器就是智商税

说下我的情况我家不能烧蚊香&#xff0c;因为我们领导说家里有小孩&#xff0c;蚊香对小孩很不好&#xff0c;这是楠哥的锅&#xff0c;我不背。但是我又不喜欢挂蚊帐&#xff0c;总觉得蚊帐挂起来后觉得很压抑&#xff0c;黑乎乎的感觉。所以能不挂的时候就不挂&#xff0c;然…