`
sunrise_king
  • 浏览: 171444 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

将普通表改为分区表

阅读更多
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操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。


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


适用于各种情况。


分享到:
评论

相关推荐

    BLOG_如何将一个普通表转换为分区表.pdf

    BLOG_如何将一个普通表转换为分区表.pdfBLOG_如何将一个普通表转换为分区表.pdf

    oracle普通表转化为分区表的方法

    主要介绍了oracle普通表转化为分区表的方法,官方给出了四种操作方法,本文主要对第四种方法进行详细分析,需要的朋友可以参考下。

    PostgreSQL 创建表分区

    创建分区表(必须继承上面的主表) CREATE TABLE users_0 ( check (uid >= 0 and uid< 100>= 100)) INHERITS (users); 3. 在分区表上建立索引,其实这步可以省略的哦 CREATE INDEX users_0_uidindex on

    DISKGEN硬盘分区及数据恢复软件

     1、支持传统的MBR分区表格式及较新的GUID分区表格式。  2、支持基本的分区建立、删除、隐藏等操作。可指定详细的分区参数;  3、支持IDE、SCSI、SATA等各种类型的硬盘。支持U盘、USB硬盘、存储卡(闪存卡);  4...

    [面试/笔试系列14]Unix笔试题、面试题集

    对分区表所作的修改在每一步完成后,都会立刻反映到分区表上,除非在第二次 打开fdisk后,选择删除新分区,再重新分区 错 2. 假设当前运行的PS命令的NI=5,则下述进程比PS进程运行级别高的进程有: 在系统默认状态下...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...

    Toad 使用快速入门

    SQL编辑器中不仅包括标准的编辑命令,也包括一些增强的功能,如快速查询表中的字段、将SQL语句的内容格式化等等。这个窗口可以处理大到4GB 的内容,对大的开发项目来说非常有用。便捷的书签可以让开发人员非常容易地...

    ONE KEY GHOST 一键备份还原

    4、解决了在个别机子上不能获取分区表信息的问题 5、修正了不能显示香港繁体中文的问题 6、修改用户自定义的普通或畸形目录为不隐藏 7、修正了同一畸形目录在不同环境下可能出错的问题 OneKey Ghost V6.5 五周年...

    EXCEL集成工具箱V6.0

    【工作表拆分】 将当前工作表的某列数据按指定条件拆分成多个工作表,可以用任意列的数据以及选定的数据做为拆分条件。 【行列奇偶选择】 可视化对当前工作表的行与列进行快速的奇偶行或奇偶列快速选定操作。 ...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【工作表拆分】 将当前工作表的某列数据按指定条件拆分成多个工作表,可以用任意列的数据以及选定的数据做为拆分条件。 【行列奇偶选择】 可视化对当前工作表的行与列进行快速的奇偶行或奇偶列快速选定操作。 ...

    protel2004封装

    protel dxp的元件封装 一、 Protel DXP中的基本PCB库: 原理图元件库的扩展名是.SchLib,PCB板...4、PCB封装更新,只要在原封装上右键弹出窗口内的footprint改为新的封装号 5、100mil=2.54mm;1mil=1/1000英寸 ...

    计算机应用技术(实用手册)

    在用光盘安装系统时就需要对此部分进设置,第一驱动改为光驱引导(First Boot Device),否则光驱不会引导装系统。 Quick Power On Self Test(快速启动选择): 当设定为[Enabled](启动)时,这个项目在系统...

    网管教程 从入门到精通软件篇.txt

    如果系统检测到无效或非标准分区表标记,将提示用户是否继续执行该命令。除非您访问驱动器有问题,否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。  format  将指定的驱动器...

    美萍足浴软件1010v2

    导出预订:在预订管理窗口中点击“导出”按钮选择相应导出格式(如:导出为Excel、导出为文本文件)可将数据表中的预订信息导出为所选择的格式。(主要作用:可对导出的数据进行排版、打印、保存)。 打印:点击...

    网吧管理系统数据库课程设计.doc

    电脑编号,上机时间,下机时间 " "分区信息表 定义了电脑分区的有关信息 分区号,电脑编号,分区名称 " "网管信息表 定义了网管有关信息 网管编号,分区号,网管姓名 " 第二章 概念结构设计 2。1 概念结构设计的方法...

    深蓝音乐铃声播放系统 v8.0.rar

     特别为学校量身定制的周作息表运行方式,可以非常好的为学校设置每天的铃声,并内置了媒体播放器,支持MP3,WAV,MID,WMA等流行的音乐格式。在安装有TTS语音库的电脑上,可以非常方便的使用文本朗读,特别合适手机...

    MySQL 5.1中文手冊

    3.3.3. 将数据装入表中 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有...

    GPRS控制卡 软件 GS7020B

    6. 支持最多8 个分区。 7. 支持每日8 个时段的8 级亮度调节(含自动开关显示屏)。 8. 支持多种节目显示方式,可单独控制进入和退出方式。 9. 可定义节目的每日播放时段(最多4 个)。 10. 可定义节目播放的起始和...

    MYSQL中文手册

    3.3.3. 将数据装入表中 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 ...

Global site tag (gtag.js) - Google Analytics