DB:11.2.0.30

将普通表转换为区分表

一.利用原表重建分区表
SQL>create table yoon ( id number primary key ,time date );

Table created.

SQL>insert into yoon select rownum,created from dba_objects;

74930 rows created.

SQL>select count(*) from yoon;
COUNT(*)
----------
74930

SQL>create table yoon_new (ID,TIME) partition by range(time)
(partition p1 values less than (to_date('2011-10-01','YYYY-MM-DD')),
partition p2 values less than (to_date('2012-10-01','YYYY-MM-DD')),
partition p3 values less than (to_date('2013-10-01','YYYY-MM-DD')),
partition p4 values less than (MAXVALUE))
as select id,time from yoon;

Table created.

SQL>select table_owner,table_name,partition_name from dba_tab_partitions where table_name='YOON_NEW';

TABLE_OWNER                    TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------ ------------------------------
YOON                           YOON_NEW                       P1
YOON                           YOON_NEW                       P2
YOON                           YOON_NEW                       P3
YOON                           YOON_NEW                       P4

SQL>alter table yoon rename to yoon_old;

Table altered.

SQL>alter table yoon_new rename to yoon;

Table altered.

SQL>select count(*) from yoon partition(p1);

COUNT(*)
----------
     74445
     
SQL> select count(*) from yoon partition(p2);

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

SQL> select count(*) from yoon partition(p3);

COUNT(*)
----------
         0
         
SQL> select count(*) from yoon partition(p4);

COUNT(*)
----------
       485
       
优点:方法简单、易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了.
缺点:1.适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大.
      2.表太大,在导入数据的时候会产生大量的UNDO;非要采用这种方式,将数据分批次导入.

二.交换分区
SQL> create table yoon ( id number primary key,time date ) ;

Table created.

SQL> insert into yoon select rownum,created from dba_objects;

74930 rows created.

SQL> commit;

Commit complete.

SQL> create table yoon_new ( id number primary key,time date ) partition by range(time)
  2  (partition p1 values less than (to_date('2015-10-01','YYYY-DD-MM')),
  3   partition p2 values less than (maxvalue));

Table created.

SQL> ALTER TABLE YOON_NEW EXCHANGE PARTITION P1 WITH TABLE YOON ;

Table altered.

SQL> select count(*) from yoon;

COUNT(*)
----------
         0
         
SQL> select count(*) from yoon_new;

COUNT(*)
----------
     74930
     
SQL> alter table yoon rename to yoon_old;

Table altered.

SQL> alter table yoon_new rename to yoon;

Table altered.

SQL> select table_owner,table_name,partition_name from dba_tab_partitions where table_name='YOON';

TABLE_OWNER                    TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------ ------------------------------
YOON                           YOON                           P1
YOON                           YOON                           P2

三.在线重定义

SQL> create table yoon ( id number primary key,time date ) ;

Table created.

SQL> insert into yoon select rownum,created from dba_objects;

74930 rows created.

SQL> commit;

Commit complete.

SQL> EXEC DBMS_REDEFINITION.can_redef_table(user,'YOON',DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL procedure successfully completed.

SQL> create table yoon_new ( id number primary key,time date ) partition by range(time)
  2  (partition p1 values less than (to_date('2011-01-01','YYYY-DD-MM')),
  3   partition p2 values less than (to_date('2012-01-01','YYYY-DD-MM')),
  4   partition p3 values less than (to_date('2013-01-01','YYYY-DD-MM')),
  5   partition p4 values less than (maxvalue));

Table created.

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER,'YOON','YOON_NEW','ID ID,TIME TIME',DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('YOON','YOON','YOON_NEW');

PL/SQL procedure successfully completed.

S
QL> select table_name from user_tables;

TABLE_NAME
------------------------------
YOON_NEW
YOON

SQL> select count(*) from yoon_new;

COUNT(*)
----------
     74930

SQL> select count(*) from yoon;

COUNT(*)
----------
     74930

SQL> select table_owner,table_name,partition_name from dba_tab_partitions where table_name='YOON';

TABLE_OWNER                    TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------ ------------------------------
YOON                           YOON                           P1
YOON                           YOON                           P2
YOON                           YOON                           P3
YOON                           YOON                           P4

在线重定义能够保证数据的一致性,在大部分时间中,表YOON都可以正常进行DML操作,在切换的瞬间锁表,具有狠高的可用性,具有狠强的灵活性,能够满足各种不同的需求.可以在切换前建立各种约束,做到切换后不用任何额外的管理操作.

Oracle 将普通表转换为分区表的更多相关文章

  1. 使用DBMS_REDEFINITION在线切换普通表到分区表

    随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式.有几种不同的方法来对此进行操作.诸如导出表数据,然后创建分区表再导入数据到分区表.使用EXCHANGE PARTITION方式来转 ...

  2. oracle之二表的几种类型

    Oracle中表的几种类型 1.表的功能:存储.管理数据的基本单元(二维表:有行和列组成)2.表的类型: 1)堆表:heap table :数据存储时,行是无序的,对它的访问采用全表扫描. 2)分区表 ...

  3. oracle表分区以及普表转分区表(转)

    概述 Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建 ...

  4. Oracle 分区表的新增、修改、删除、合并。普通表转分区表方法

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

  5. Oracle数据表转换为Shapefile(二)

    在上一篇博文<Oracle数据表转换为Shapefile(一)>中详细描述了一种基于Oracle数据表生产Shapefile的技术方法,本文同样以详细图解的方式描述一种更便捷的方法来完成同 ...

  6. Oracle数据表转换为Shapefile(一)

    严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...

  7. oracle move表空间(分区表,索引)

    1.修改分区表分区表空间 SELECT 'ALTER TABLE ' || table_owner || '.' || TABLE_NAME || ' MOVE PARTITION ' || PART ...

  8. Oracle SQL调优之分区表

    目录 一.分区表简介 二.分区表优势 三.分区表分类 3.1 范围分区 3.2 列表分区 3.3 散列分区 3.4 组合分区 四.分区相关操作 五.分区相关查询 附录:分区表索引失效的操作 一.分区表 ...

  9. ORACLE修改用户表所属表空间的步骤

    ORACLE修改用户表所属表空间的步骤 使用脚本进行修改.据目前所了解,正长情况下需要修改表的空间和表的索引的空间,如果涉及到BOLB字段的表,修改的方式又不一样了!正常情况下的修改脚本:1.修改表的 ...

随机推荐

  1. 如何让 Drupal 使用 Wordpress 形式的编辑代码?

    如果你曾有过将 Wordpress 网站迁移到 Drupal 的经验,很可能客户会问的第一件事就是如何为 Drupal 添加编辑代码. Wordpress 中的 Shortcodes 插件让使用者可以 ...

  2. Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义

    条款6:当auto推导出意外的类型时,使用显式的类型初始化语义 条款5解释了使用auto来声明变量比使用精确的类型声明多了了很多的技术优势,但有的时候,当你想要zag的时候,auto可能会推导出了zi ...

  3. 【Flex教程】#009 As/typeof /instanceof /is的作用

    “as” :主要用它做类型转化 假设有一个类叫做Class1,我们声明了一个它的对象 c1,如果想要将它转换成Class2类型,只要这样写: Class2(c1); AS3 中的操作符: as 实现就 ...

  4. Web 项目 中读取专用配置文件

    在 web 开发中,有时我们要为 业务逻辑处理 配置专用的 配置文件,也就是 xml 文件,这样可以极大的方便维护工作,但是读取 专用的配置文件还需要自己写一个方法,在这里,我封装了一个公用 的方法: ...

  5. rsync拉取远程文件

    mkdir -p   /doc sshpass -p ''pwd" rsync -avz -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictH ...

  6. eclipse+maven+jetty环境下修改了文件需要重启才能修改成功

    遇到这种情况,需要在类库文件夹中修改配置文件(C:\.m2\repository\org\mortbay\jetty\jetty\6.1.22) 在以上路径下添加如下路径的压缩文件中的两个文件即可 路 ...

  7. python jinjia2模板使用

    https://gist.github.com/wrunk/1317933 #!/usr/bin/env python # -*- coding: utf-8 -*- from jinja2 impo ...

  8. 用代码打开FORM里面用到的数据源

    修改动态报表的时候,尝尝需要根据当前设计里指定的数据源,然后打开AOT去查找,相当的不方便. 于是产生写了一个方法,可以根据传过来的数据源名,去AOT找到TABLE或者VIEW, 直接打开,以便修改. ...

  9. 深入了解Qt(三)之元signal和slot

    深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解.在此向原作者表示感谢! 在Qt 信号和槽函数这篇文章中已经详细地介绍了信号和槽的使用及注意事项.在这里对其使用方面的知识 ...

  10. [Ajax] 使用Ajax异步上传图片文件(非Form表单提交)

    通过表单Form提交来上传文件的方式这里就不说了: 下面介绍,通过js中使用ajax异步上传图片文件: 新建一个html页面和一个一般处理程序即可: 涉及思路: //发送2次Ajax请求完成js异步上 ...