当前位置: 首页 > 编程日记 > 正文

oracle 分区表的建立方法

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

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

分区提供以下优点: 

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

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

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

提高可管理性、可用性和性能。 

Oracle提供了以下几种分区类型:

范围分区(range);

哈希分区(hash);

列表分区(list);

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

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

Oracle的普通表没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并说明它们各自的特点。


方法一:利用原表重建分区表。 

步骤: 

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
  2  (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
  3  PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
  4  PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
  5  PARTITION P4 VALUES LESS THAN (MAXVALUE))
  6  AS SELECT ID, TIME FROM T;

表已创建。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
      6264

SQL> SELECT COUNT(*) FROM T PARTITION (P1);

COUNT(*)
----------
         0

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
      6246

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
        18

优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。

不足:对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对T的访问会失败。

适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。 

方法二:使用交换分区的方法。 

步骤: 

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
  2  (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
  3  PARTITION P2 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

表已更改。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
      6264

优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。

不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。

适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。 

方法三:Oracle9i以上版本,利用在线重定义功能

步骤: 

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
  2  (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
  3  PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
  4  PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
  5  PARTITION P4 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW', -
> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('YANGTK', 'T', 'T_NEW');

PL/SQL 过程已成功完成。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
      6264

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
      6246

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
        18

优点:保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

不足:实现上比上面两种略显复杂。 

适用于各种情况。 

这里只给出了在线重定义表的一个最简单的例子,详细的描述和例子可以参考下面两篇文章。 

Oracle的在线重定义表功能:http://blog.itpub.net/post/468/12855

Oracle的在线重定义表功能(二):http://blog.itpub.net/post/468/12962

索引也可以进行分区,分区索引有两种类型:global和local。对于local索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由Oracle自动进行。对于global索引,可以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的INVALDED,必须在执行完操作后REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES语句,可以使在进行分区维护的同时重建全局索引。

全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快
注意:不能为散列分区 或者 子分区创建全局索引

Oracle的分区功能十分强大。不过用起来发现有两点不大方便:

第一是已经存在的表没有方法可以直接转化为分区表。不过Oracle提供了在线重定义表的功能,可以通过这种方式来完成普通表到分区表的转化。可以参考这个例子:http://blog.itpub.net/post/468/13091

第二点是如果采用了local分区索引,那么在增加表分区的时候,索引分区的表空间是不可控制的。如果希望将表和索引的分区分开到不同的表空间且不同索引分区也分散到不同的表空间中,那么只能在增加分区后,对新增的分区索引单独rebuild。

Oracle最大允许存在多少个分区呢?

我们可以从Oracle的Concepts手册上找到这个信息,对于Oracle9iR2:

Tables can be partitioned into up to 64,000 separate partitions.

对于Oracle10gR2,Oracle增强了分区特性:

Tables can be partitioned into up to 1024K-1 separate partitions.

关于何时应该进行分区,Oracle有如下建议:

■ Tables greater than 2GB should always be considered for partitioning.
■ 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.

相关文章:

QSignalMapper的使用

官方文档:http://doc.qt.io/qt-5/qsignalmapper.html 参考: https://blog.csdn.net/nirendao/article/details/51607115 QSignalMapper 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject*参数或者QWidget*参数的信号,在具体的项目中…

策略模式 极其简单的列子

第一篇博客 本文来自 自己老师 的博客 http://blog.csdn.net/lovelion/article/details/7818983 题目:某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下: (…

Git使用指南

1.创建目录 $ git config --global user.name "Your Name Comes Here" $ git config --global user.email youyourdomain.example.com $ git config --list 查看相关信息 $ git init 如果作为 Server 存在,那么可以忽略工作目录,以纯代码仓库形…

【Linux】Linux简单操作之安装、使用tomcat

tomcat安装 1、下载tomcat到指 文件夹 : home / local 中 2、将文件见解压到文件夹 :usr / local 当中 代码实现 : tar -zxvf -C /usr/local tomcat使用 1、进入到bin目录下,找到文件startup.sh 注: 是tomcat文件…

男人约会动机大揭秘。

被人约是好事,但也要眼明心亮,男人约会动机大揭秘。 男人约会动机大揭秘: 1:这是一个有诚意的开始,表明他是早有计划和你约会的。至少,也说明他有相当的社交礼貌。 2:这个男人可能只是一时寂寞了…

WebService之soap类型的服务和rest类型的服务

1.引言 WebService顾名思义就是web服务,web服务主要有两种,一种是基于soap类型的服务,一种是基于rest类型的服务,其中soap类型的服务有两种版本,一种是soap1.1版本,一种是soap1.2版本,soap服务类…

【二级java】二叉树序列

https://www.cnblogs.com/caozengling/p/5318504.html

Qt/Linux 下的摄像头捕获(Video4Linux2)

Linux下使用各种设备是一件令人兴奋的事情。在Unix的世界里,用户与硬件打交待总是简单的。最近笔者在Linux下搞了摄像头的开发,有一点感想发于此处。 Linux中操作一个设备一般都是打开(open),读取(read&…

ubuntu chm文档阅读器

一,chm阅读器名称 KchmViewer 安装方法 sudo apt-get install kchmviewer 使用 kchmviewer #非root用户可以直接使用 转载于:https://www.cnblogs.com/jiangfeilong/p/11184226.html

c++语言中,vector容器与list容器的区别和联系?_百度知道

C STL 提供了3个序列容器 :vector, deque, list vector 中的元素是顺序存放的,所以随机访问很快,但是要插入和删除,这个时间复杂度就很高了,vector初始化时有一个capacity,如果元素个数超出capacity,那vector就会重新分配一个新的…

《Java技术》第三次作业--面向对象——继承、抽象类、接口

1.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Grandp…

《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

新手入门:C/C中枚举类型(enum)   如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。   举个例子来说明一吧,为了让大家更明白一点&…

【二级java】 二分法查找

例题1 :对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为______。 解析: 如果线性表中的第一个元素就是被查找元素,则只需做一次比较就查找成功 查找次数为1 如果线形表中不存在该数据,查找次数为n 例…

List和ObservableCollection的相互转化

在WPF &#xff0c; silverlight &#xff0c;WP7中经常会用到List<T>和ObservableCollection<T>。这里简单讲一下他们之间的相互转换。 1.List<T>的简单介绍&#xff1a; List<T>代表的是强类型的Ojbect集合&#xff0c;可以通过索引访问并且提供了查…

获取局域网打印机列表

/// <summary> /// 获取局域网打印机列表 /// </summary> /// <param name"DefaultPrinter">默认打印机</param> /// <returns>局域网中所有打印机列表</returns> public static List&…

戏说 .NET GDI+系列学习教程(三、Graphics类的应用_验证码)

关于Graphics也有了基本了解下面想说的的是学这个东东干什么呢&#xff0c;到底如何应用目前常见应用1、验证码&#xff08;参照网上的&#xff09;2、打印排版&#xff08;会提到关于条形码大小设置&#xff09;3、自定义控件 一、验证码 1 class ValidateCode2 {3 …

转载:HBuilder常用快捷键

原文&#xff1a;http://www.cnblogs.com/DCL1314/p/8625110.htmlHBuilder常用快捷键1.文件新建 Ctrl N 关闭 Ctrl F4 全部关闭 Ctrl Shift F4 属性 Alt Enter 2.编辑激活代码助手 Alt / 激活快捷键视图 Ctrl Shift L开启关闭注释整行 Ctrl / 开启关闭注释已选内容 Ct…

java源程序结构

JAVA培训 一个完整的java源程序应该包括下列部分&#xff1a;  package语句&#xff1b; //该部分至多只有一句&#xff0c;必须放在源程序的第一句  import语句&#xff1b; /*该部分可以有若干import语句或者没有&#xff0c;必须放在所有的          类定义之前…

【二级java】排序技术

例题1 &#xff1a;希尔排序属于下列哪种排序法 解析&#xff1a; 希尔排序法的基本思想是&#xff1a; 将整个无序序列分割成若干小的子序列分别进行插入排序&#xff0c;所以属于插入排序 例题2 &#xff1a; 在下列几种排序方法中&#xff0c;要求内存量最大的是 解析&am…

HDU 1257 - 最少拦截系统 ( LIS / 贪心 )

题目 现在有一种拦截系统&#xff0c;第一发拦截可以是任意高度&#xff0c;但是之后的拦截高度不能比上次高。为了拦截下所有的炮弹&#xff0c;最少需要准备几套拦截系统&#xff1f; 思路 可能是语文没学好吧&#xff0c;一开始被题意卡了一下。&#xff08;而且题目连数据范…

python练习:猜价钱小游戏

#猜价钱 trueprice 202 price input("Please guess the price:") while (int(price) ! trueprice):if(int(price) > trueprice):price input("Your price is higher,Please try again:")else:price input("Your price is lower,Please try aga…

android系统短信库的一些用法

1、查询所有短信&#xff0c;按发件人进行分组Cursor mCursor managedQuery(Uri.parse("content://sms"),new String[] {"_id,address,date,read,status,type,body,count(address) as " "totleCount from (select _id,substr(address,4) as address,…

【二级java】操作题知识点积累

1、java中^代表亦或&#xff08;相同为0&#xff0c;不同为1&#xff09; 2、使用下标直接访问字符串中字符的方法 string.charAt&#xff08;&#xff09; 3、从主方法派出异常给jvm时 使用的是 throws 而不是 throw 4、使用InputStreamReader 、BufferedReader时需要使用的包…

Utilize Sql Tuning Advisor from Script

Sql Tuning Advisor是10g以后出现的一个十分有用的调优工具&#xff0c;大多数情况下我们可以通过dbconsole或者Grid Control的web界面调用SQL Advisor&#xff1b;但如果系统中没有配置dbconsole或者Grid Control的话&#xff0c;我们则需要通过手动调用DBMS_SQLTUNE PL/SQL程…

Isight 命令行运行任务

说明书参考:https://abaqus-docs.mit.edu/2017/English/DSSIMULIA_Established.htm 不一定对版本。但是大部分还可以。 不对的可以在命令里敲help 首先&#xff0c;说明书里的命令行客户端默认加入环境变量。 实测win/linux安装没有环境变量。可以自行添加也可找到目录自行运行…

【二级java】软件工程基础

1、软件工程三要素 &#xff1a; 方法 工具 过程 2、软件工程中根本上来说是为了研究软件开发技术 3、软件工程的定义 &#xff1a; 应用于计算机软件的定义、开发维护的一整套方法、工具、文档、实践标准和工序 4、软件危机的表现 &#xff1a; 软件的生命周期&#xff1a;…

ASP.NET WebAPI 11 参数验证

在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性. ModelState 在ApiController中一个ModelState属性用来获取参数验证结果. public abstract class ApiController : IHttpController, IDisposable{public ModelStateDictionary …

C#WinForm的线程及Invoke应用(转)

C#多线程异步访问winform中控件 http://zwkufo.blog.163.com/blog/static/25882512009111453957552/?fromdm&fromSearch&isFromSearchEngineyes 我们在做winform应用的时候&#xff0c;大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传…

C/C++语言点滴

C/C学习笔记 1.C语言中使用关键字sizeof来求数组长度 char temp[3]; int tempLen sizeof(temp)/sizeof(char); strlen只能用来求字符串长度 2.交换两个数据的几种方法及其区别 方法一&#xff1a;值传递&#xff0c;在main函数中并未改变a,b 的值&#xff0c;虽然在swap中a…

[C#][EF] 添加表添加不进来

确认此表有没有主键&#xff0c;没有主键时就会这样。转载于:https://www.cnblogs.com/z5337/p/8891230.html