硬盘数据恢复导航
RAID数据恢复导航
 | 网站首页 | 数据恢复资料 | 数据恢复软件 | 咨询留言 | 数据恢复博客 | 数据恢复论坛 | 
数据恢复软件下载
公司简介 数据恢复成功案例 数据恢复报价 数据恢复培训 数据恢复技术文章 数据恢复客服中心 数据恢复服务联系方式
您现在的位置: 北亚数据恢复技术站 >> 数据恢复资料 >> 数据恢复常识 >> 文章正文
Oracle下将非分区表转换为分区表            【字体:小 大】
Oracle下将非分区表转换为分区表
作者:未知    文章来源:网络    点击数:    更新时间:2009-5-7

很多数据库在设计时未能很好的规划数据库的容量, 导致在某些情况下, 导致一个表中存放了数百万, 数千万甚至上亿条记录, 维护起来非常的不便, 下面介绍一种将非分区表转换为分区表的方法.
testtb_nopart是一个非分区表, 基本信息如下:
SQL> desc testtb_nopart
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TIMESTAMP                                          DATE
 OWNER                                              VARCHAR2(30)
 ACTION                                             VARCHAR2(6)
 OBJECT_NAME                                        VARCHAR2(128)
 MESSENG                                            VARCHAR2(169)

SQL> select to_char(timestamp, 'mm-yyyy'), count(*) from testtb_nopart group by to_char(timestamp, 'mm-yyyy');

TO_CHAR   COUNT(*)
------- ----------
12-2005    2058125
11-2005    1363431
08-2005     150951
10-2005     628149
07-2005    1006340
09-2005     730410

6 rows selected.


创建分区表testtb_part, 结构和testtb_nopart一致.
create table testtb_part (timestamp date, owner varchar2(30), action varchar2(6), object_name varchar2(128) , messeng varchar2(169))
tablespace testts
partition by range(timestamp)(
partition rest values less than (maxvalue))


交换testtb_nopart和testtb_part中part分区的数据
SQL> alter table testtb_part exchange partition rest with table testtb_nopart;

Table altered.

SQL> select to_char(timestamp, 'mm-yyyy'), count(*) from testtb_nopart group by to_char(timestamp, 'mm-yyyy');

no rows selected

SQL> c/nopart/part/
  1* select to_char(timestamp, 'mm-yyyy'), count(*) from testtb_part group by to_char(timestamp, 'mm-yyyy')
SQL> /

TO_CHAR   COUNT(*)
------- ----------
12-2005    2058125
11-2005    1363431
08-2005     150951
10-2005     628149
07-2005    1006340
09-2005     730410

6 rows selected.


testtb_nopart中大约有50万条记录, 占用600m左右空间, 交换大约用了不到30秒钟, testtb_part和testtb_nopart所在的表空间也没有明显增长.

对rest分区进行拆分
SQL> alter table testtb_part split partition rest at (to_date('200508','yyyymm'))
  2  into (partition part08, partition rest);

Table altered.

SQL>  alter table testtb_part split partition rest at (to_date('200509','yyyymm'))
  2  into (partition part08, partition rest);

Table altered.

SQL>  alter table testtb_part split partition rest at (to_date('200510','yyyymm'))
  2   into (partition part09, partition rest);

Table altered.

SQL>  alter table testtb_part split partition rest at (to_date('200511','yyyymm'))
  2  into (partition part10, partition rest);

Table altered.

SQL> alter table testtb_part split partition rest at (to_date('200512','yyyymm'))
  2  into (partition part11, partition rest);

Table altered.

SQL> alter table testtb_part split partition rest at (to_date('200601','yyyymm'))
  2  into (partition part12, partition rest);

Table altered.


最后可以重命名表, 使得转换过程不影响用户程序.
alter table testtb_part rename to testtb_nopart

文章录入:a    责任编辑:a 
  • 上一篇文章:

  • 下一篇文章:
  • 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    关于我们 | RAID数据恢复 | 友情链接 | RSS生成 | XML生成 | 文章HTML地图 | 下载HTML地图

    版权所有 北亚数据恢复中心
    全国统一客服电话:4006-505-808
    北京市海淀区永丰基地丰慧中路7号新材料创业大厦B座205室
    京ICP备05011939
    o�a f