原文:http://www.tuicool.com/articles/MzeM7r

一、什么是分区表

Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。

Oracle的分区表可以包括多个分区, 每个分区都是一个独立的段( SEGMENT),可以存放到不同的表空间中 。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。

二、什么时候用分区表

When to Partition a Table 什么时候需要分区表,官网的 2 个建议如下:

(1)Tables greater than 2GB should always be considered for partitioning.

(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.

三、分区表优点

(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;

(2)可以对单独的分区进行备份和恢复;

(3)可以将分区映射到不同的物理磁盘上,来分散IO;

(4)提高可管理性、可用性和性能。

四、分区表类型

(1)范围分区(range)——我们这篇博文的内容;

(2)哈希分区(hash);

(3)列表分区(list);

(4)范围-哈希复合分区(range-hash);

(5)范围-列表复合分区(range-list)。

五、Range 分区

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

如按照时间划分,2010年1月的数据放到a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。

在按时间分区时, 如果某些记录暂无法预测范围,可以创建 maxvalue 分区,所有不在指定范围内的记录都会被存储到 maxvalue 所在分区中。

六、Range分区实例说明

例子:创建一张表,表有两个字段(ID、TIME),我们完成对TIME列的范围分区,即将1-12月创建成对应的12个分区表,对分区表及分区表数据进行增删查改操作。

创建分区表:

创建表同时完成对表进行分区(按月份分区)

 
  1. /*创建分区表*/
  2. create table pdba (id number, time date) partition by range (time)
  3. (
  4. partition p1 values less than (to_date('2013-02-1', 'yyyy-mm-dd')),
  5. partition p2 values less than (to_date('2013-03-1', 'yyyy-mm-dd')),
  6. partition p3 values less than (to_date('2013-04-1', 'yyyy-mm-dd')),
  7. partition p4 values less than (to_date('2013-05-1', 'yyyy-mm-dd')),
  8. partition p5 values less than (to_date('2013-06-1', 'yyyy-mm-dd')),
  9. partition p6 values less than (to_date('2013-07-1', 'yyyy-mm-dd')),
  10. partition p7 values less than (to_date('2013-08-1', 'yyyy-mm-dd')),
  11. partition p8 values less than (to_date('2013-09-1', 'yyyy-mm-dd')),
  12. partition p9 values less than (to_date('2013-10-1', 'yyyy-mm-dd')),
  13. partition p10 values less than (to_date('2013-11-1', 'yyyy-mm-dd')),
  14. partition p11 values less than (to_date('2013-12-1', 'yyyy-mm-dd')),
  15. partition p12 values less than (to_date('2014-01-1', 'yyyy-mm-dd'))
  16. --partition p13 values less than (maxvalue) --不建议使用
  17. )

查询所有分区表,验证分区表是否创建成功。

  1. select * from ALL_TAB_PARTITIONS a --不能加任何where条件

结果如下图:

添加数据:

为了测试效果,我们添加120万条数据,每月添加10万条数据:

 
  1. /*添加数据*/
  2. declare
  3. begin
  4. for n in 1..100000 LOOP
  5. -- insert into sale_data select * from sale_data;
  6. insert into pdba VALUES(1,to_date('2013-01-05','yyyy-mm-dd'));
  7. insert into pdba VALUES(2,to_date('2013-02-05','yyyy-mm-dd'));
  8. insert into pdba VALUES(3,to_date('2013-03-05','yyyy-mm-dd'));
  9. insert into pdba VALUES(4,to_date('2013-04-05','yyyy-mm-dd'));
  10. insert into pdba VALUES(5,to_date('2013-05-05','yyyy-mm-dd'));
  11. insert into pdba VALUES(6,to_date('2013-06-05','yyyy-mm-dd'));
  12. insert into pdba VALUES(7,to_date('2013-07-05','yyyy-mm-dd'));
  13. insert into pdba VALUES(8,to_date('2013-08-05','yyyy-mm-dd'));
  14. insert into pdba VALUES(9,to_date('2013-09-05','yyyy-mm-dd'));
  15. insert into pdba VALUES(10,to_date('2013-10-05','yyyy-mm-dd'));
  16. insert into pdba VALUES(11,to_date('2013-11-05','yyyy-mm-dd'));
  17. insert into pdba VALUES(12,to_date('2013-12-05','yyyy-mm-dd'));
  18. end loop;
  19. end;

测试数据是否添加正确:

先查看物理表记录:

  1. /*验证*/
  2. select count(*) from pdba

结果如下图:

 

再随机查看分区表,数据, 比如我们查看12月份的分区表数据,理论应该是10W条。

  1. /*分区表查询*/
  2. select count(*) from pdba partition(p12) --一月份
 
       

至此我们创建、验证、并向表中添加数据 完成。

 

查询分区表:

  1. /*分区表查询*/
  2. select * from pdba partition(p12) --十二月份

删除分区表:

( 数据也会被删除 )

  1. /*删除分区表*/
  2. ALTER TABLE pdba DROP PARTITION P12;

当我们再次查询十二月份的分区表时:

  1. /*分区表查询*/
  2. select * from pdba partition(p12) --十二月份
 

结果如下:

而我们物理表中数据也会减少10w条。

  1. select count(*) from pdba

结果如下:

 

增加分区表:

现在的物理表只有1到11月份的分区表,那我们再次添加12月份的分区表并再次添加10w条数据

  1. /*增加分区表*/
  2. ALTER TABLE pdba ADD PARTITION P12 VALUES LESS THAN(TO_DATE('2014-01-01','YYYY-MM-DD'));

添加数据:

  1. /*添加数据*/
  2. declare
  3. begin
  4. for n in 1..100000 LOOP
  5. insert into pdba VALUES(12,to_date('2013-12-05','yyyy-mm-dd'));
  6. end loop;
  7. end;

再次查询十二月份的分区表验证操作是否成功

  1. /*分区表查询*/
  2. select count(*) from pdba partition(p12) --十二月份

结果如图:

合并分区表:

例子:将11月和12月的分区表合并在一起。

  1. /*合并分区表*/
  2. ALTER TABLE pdba MERGE PARTITIONS p11, p12 INTO PARTITION p13

分区表合并后,原分区表空间被释放,原数据均转移到新的表空间下。

现在查询新的分区表,数据应该为20w条。

  1. select count(*) from pdba partition(p13)

结果如图:

分割分区表:

 

例子:将p13分区表分割成p11和p12分区表,即将11月和12月数据重新分割开。

  1. /*一个分区表分割成两个分区表*/
  2. alter table pdba split Partition p13 at (to_date('2013-12-01','yyyy-mm-dd')) into (Partition p11,Partition p12);

过程和合并分区表下相反。

现在p11和p12表空间和数据重新恢复和添加。

11月和12月各10w条数据

更改分区表名:

  1. --更改分区表名
  2. alter table pdba rename Partition p11 to p22;

增删查改分区表的数据:

操作与物理表几乎相同, 只是操作分区表时在分区表前加入 物理表名称即可。具体如下图:

 
  1. --查询分区表数据
  2. select DISTINCT * from pdba partition(p12)
  3. --修改分区表数据
  4. update pdba partition(p12) p set p.time = to_date('2013-12-08','yyyy-mm-dd');
  5. --增加分区表数据
  6. insert into pdba partition(p12) p VALUES(1,to_date('2013-12-29','yyyy-mm-dd'));
  7. --删除分区表数据
  8. delete from pdba partition(p12) t where t.id = 1

七、附录:

显示分区表信息

显示数据库所有分区表的信息:DBA_PART_TABLES

显示当前用户可访问的所有分区表信息:ALL_PART_TABLES

显示当前用户所有分区表的信息:USER_PART_TABLES

显示表分区信息 显示数据库所有分区表的详细分区信息:DBA_TAB_PARTITIONS

显示当前用户可访问的所有分区表的详细分区信息:ALL_TAB_PARTITIONS

显示当前用户所有分区表的详细分区信息:USER_TAB_PARTITIONS

显示子分区信息 显示数据库所有组合分区表的子分区信息:DBA_TAB_SUBPARTITIONS

显示当前用户可访问的所有组合分区表的子分区信息:ALL_TAB_SUBPARTITIONS

显示当前用户所有组合分区表的子分区信息:USER_TAB_SUBPARTITIONS

显示分区列 显示数据库所有分区表的分区列信息:DBA_PART_KEY_COLUMNS

显示当前用户可访问的所有分区表的分区列信息:ALL_PART_KEY_COLUMNS

显示当前用户所有分区表的分区列信息:USER_PART_KEY_COLUMNS

显示子分区列 显示数据库所有分区表的子分区列信息:DBA_SUBPART_KEY_COLUMNS

显示当前用户可访问的所有分区表的子分区列信息:ALL_SUBPART_KEY_COLUMNS

显示当前用户所有分区表的子分区列信息:USER_SUBPART_KEY_COLUMNS

Range分区表基本操作如上,高级操作,如分区表下在分区,建立视图等,未完待续。

Oracle 分区表-Range分区的更多相关文章

  1. 深入学习Oracle分区表及分区索引

    关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Has ...

  2. oracle 分区表和分区索引

    很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...

  3. ORACLE分区表、分区索引详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt160 ORACLE分区表.分区索引ORACLE对于分区表方式其实就是将表分段 ...

  4. 【三思笔记】 全面学习Oracle分区表及分区索引

    [三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...

  5. Oracle分区表之分区范围扫描(PARTITION RANGE ITERATOR)与位图范围扫描(BITMAP INDEX RANGE SCAN)

    一.前言: 一开始分区表和位图索引怎么会挂钩呢?可能现实就是这么的不期而遇:比如说一张表的字段是年月日—‘yyyy-mm-dd’,重复率高吧,适合建位图索引吧,而且这张表数据量也不小,也适合转换成分区 ...

  6. 转:深入学习Oracle分区表及分区索引

    转自:http://database.ctocio.com.cn/tips/286/8104286.shtml 关于分区表和分区索引(About Partitioned Tables and Inde ...

  7. 简单ORACLE分区表、分区索引

    前一段听说CSDN.COM里面很多好东西,同事建议看看合适自己也可以写一写,呵呵,今天第一次开通博客,随便写点东西,就以第一印象分区表简单写第一个吧. ORACLE对于分区表方式其实就是将表分段存储, ...

  8. oracle分区表和分区索引概述

    ㈠ 分区表技术概述            ⑴ Range 分区            ① 例子                  create table t         (...列定义...)  ...

  9. Oracle分区表删除分区引发错误ORA-01502: 索引或这类索引的分区处于不可用状态

    (一)问题: 最近在做Oracle数据清理,在对分区表进行数据清理时,采用的方法是drop partition,删除的过程中,没有遇到任何问题,大概过了10分钟,开发人员反馈部分分区表上的业务失败.具 ...

随机推荐

  1. 2017.11.2 Talk to customers for an hour

    yesterday::: Hi Huang, For the better performance of the test the Con 6 should be connected all the ...

  2. 不用配置 , 快速搭建react环境

    链接 create-react-app react-webpack-generators react-cli

  3. git pull VS git fetch&merge

    使用git fetch和git pull都可以更新远程仓库的代码到本地,但是它们之间还是有区别. git fetch  git fetch origin master git log -p maste ...

  4. 机器学习算法实现解析——libFM之libFM的训练过程概述

    本节主要介绍的是libFM源码分析的第四部分--libFM的训练. FM模型的训练是FM模型的核心的部分. 4.1.libFM中训练过程的实现 在FM模型的训练过程中,libFM源码中共提供了四种训练 ...

  5. 6.etc目录下重要文件和目录详解

    1./etc/下的重要的配置文件 /etc(二进制软件包的 yum /rpm 安装的软件和所有系统管理所需要的配置文件和子目录.还有安装的服务的启动命令也放置在此处) /etc/sysconfig/n ...

  6. Sphinx 匹配模式

    所谓匹配模式就是用户如何根据关键字在索引库中查找相关的记录. SPH_MATCH_ALL, 匹配所有查询分词(默认模式); 如“手机配件”,不匹配 “我有一部手机”,但可以匹配 “手机坏了,需要找配件 ...

  7. SSH框架(2)

    个人分类: Java面试   Struts 谈谈你对Struts的理解. 答: 1.struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为Acti ...

  8. win10 svn server安装过程中到starting service时失败

    当安装到Start Service阶段后,将会出错并会弹出一个对话框,提示是否要retry. (此时SVN服务软件已经安装完毕,仅仅是无法通过证书验证,无法启动服务),如果此时选择对话框中的cance ...

  9. 十三、python沉淀之路--文件操作

    一.文件的读操作 例1 f = open('学习',encoding='utf-8') #首先要打开文件,不然直接读,是读不出来的 data = f.read() #read后的括号里不添加任何东西 ...

  10. gitlab pipelines 使用

    1. 安装runner   # For Debian/Ubuntu curl -L https://packages.gitlab.com/install/repositories/runner/gi ...