ITPub博客

首页 > 数据库 > Oracle > 大表里有数据时表分区参考脚本

大表里有数据时表分区参考脚本

原创 Oracle 作者:kuqlan 时间:2011-11-29 19:17:21 0 删除 编辑

近期关于表分区进行一定学习和参考网上的部分资料的基础上,对原表有数据情况时的三种分区方法进行部分补充:

--方法一,利用原表重建分区表(本测试是通过system用户登录并执行的)drop table t
drop table t_old

CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
INSERT INTO T
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <= 2000;
COMMIT;

CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
(PARTITION P1 VALUES LESS THAN (TO_DATE('2008-1-1', 'YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2009-1-1', 'YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (TO_DATE('2010-1-1', 'YYYY-MM-DD')),
PARTITION P4 VALUES LESS THAN (MAXVALUE))
AS SELECT ID, TIME FROM T;


RENAME T TO T_OLD;
RENAME T_NEW TO T;

SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T PARTITION (P1);
SELECT COUNT(*) FROM T PARTITION (P2);
SELECT COUNT(*) FROM T PARTITION (P3);
SELECT COUNT(*) FROM T PARTITION (P4);

SELECT * FROM T;

注意点:rename名利只能在同一个用户才能执行成功。如果写成如下则会报错:
RENAME system.T TO system.T_OLD;

或system用户身份企图修改别的用户,也同样会报错:
RENAME rep.T TO rep.T_OLD;

[@more@]

--方法二:使用交换分区的方法(本测试是通过system用户登录并执行的)

Drop table t;
Drop table t_new;
Drop table t_old;

CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
INSERT INTO T
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <= 2000;
COMMIT;

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


ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

RENAME T TO T_OLD;
RENAME T_NEW TO T;

SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T PARTITION (P1);
SELECT COUNT(*) FROM T PARTITION (P2);

如果在这两个分区基础,要把它分成更更多分分区,则需要指向split操作,如下所示:

alter table system.t split partition P1 at(to_date('2010-1-1','YYYY-MM-DD')) into (partition p_2009,partition t_upper);
SELECT * FROM T PARTITION (p_2009);
SELECT * FROM T PARTITION (t_upper);

alter table system.t split partition p_2009 at(to_date('2009-1-1','YYYY-MM-DD')) into (partition p_2008,partition p_2009);
SELECT * FROM T PARTITION (p_2008);
SELECT * FROM T PARTITION (p_2009);

alter table system.t split partition p_2008 at(to_date('2008-1-1','YYYY-MM-DD')) into (partition p_2007,partition p_2008);
alter table system.t split partition p_2007 at(to_date('2007-1-1','YYYY-MM-DD')) into (partition p_2006,partition p_2007);
alter table system.t split partition t_upper at(to_date('2011-1-1','YYYY-MM-DD')) into (partition p_2010,partition p_2011);

SELECT * FROM T PARTITION (p_2006);
SELECT * FROM T PARTITION (p_2007);
SELECT * FROM T PARTITION (p_2008);
SELECT * FROM T PARTITION (p_2009);
SELECT * FROM T PARTITION (p_2010);
SELECT * FROM T PARTITION (p_2011);
SELECT * FROM T PARTITION (P2);

---方法三:Oracle9i以上版本,利用在线重定义功能 (本测试是通过system用户登录并对rep用户下的对象进行了分区操作)

Drop table rep.t1;
CREATE TABLE rep.T1 (ID NUMBER PRIMARY KEY, TIME DATE);
INSERT INTO rep.T1
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <= 2000;
COMMIT;

begin
DBMS_REDEFINITION.CAN_REDEF_TABLE('REP', 'T1');
end;
--或
call DBMS_REDEFINITION.CAN_REDEF_TABLE('REP', 'T1');
--或在命令窗口中执行SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('REP', 'T1');
--SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('ERP', 'T1',dbms_redefinition.cons_use_pk);
PL/SQL 过程已成功完成。

CREATE TABLE rep.T1_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
(PARTITION P_2006 VALUES LESS THAN (TO_DATE('2007-1-1', 'YYYY-MM-DD')),
PARTITION P_2007 VALUES LESS THAN (TO_DATE('2008-1-1', 'YYYY-MM-DD')),
PARTITION P_2008 VALUES LESS THAN (TO_DATE('2009-7-1', 'YYYY-MM-DD')),
PARTITION P_2009 VALUES LESS THAN (TO_DATE('2010-7-1', 'YYYY-MM-DD')),
PARTITION P_2010 VALUES LESS THAN (TO_DATE('2011-7-1', 'YYYY-MM-DD')),
PARTITION P_2011 VALUES LESS THAN (MAXVALUE));

表已创建。
begin
DBMS_REDEFINITION.START_REDEF_TABLE('rep', 'T1', 'T1_NEW');
end;
--或在命令窗口中执行SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('rep', 'T1', 'T1_NEW');
PL/SQL 过程已成功完成。

begin
DBMS_REDEFINITION.FINISH_REDEF_TABLE('rep', 'T1', 'T1_NEW');
end;
--或在命令窗口中执行EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('rep', 'T1', 'T1_NEW');
PL/SQL 过程已成功完成。

SELECT COUNT(*) FROM rep.T1;
SELECT * FROM rep.T1 PARTITION (p_2006);
SELECT * FROM rep.T1 PARTITION (p_2007);
SELECT * FROM rep.T1 PARTITION (p_2008);
SELECT * FROM rep.T1 PARTITION (p_2009);
SELECT * FROM rep.T1 PARTITION (p_2010);
SELECT * FROM rep.T1 PARTITION (p_2011);

SELECT COUNT(*) FROM rep.t1_new;
SELECT * FROM rep.t1_new PARTITION (p_2006);

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18841027/viewspace-1056610/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: EXPDP的parallel参数
请登录后发表评论 登录
全部评论
Oracle技术爱好者,Oracle10g OCM,网名 KUQLAN ,具有7的年Oracle数据库管理实践,曾经参加过BOSS、ERP、云计算(OpenStack+kvm)等项目的一线工作。以前写博客是为了自己,而现在是为了自己和别人。因为领会了帮助别人和分享、沉淀和积累会创造快乐和价值...

注册时间:2009-01-26

  • 博文量
    183
  • 访问量
    1681016