The important thing in life is to have a great aim , and the determination

常用链接

统计

IT技术链接

保险相关

友情链接

基金知识

生活相关

最新评论

普通表转分区表和交换分区(oracle)

将普通表转换成分区表有4种方法:  

       1. Export/import method  

       2. Insert with a subquery method  

       3. Partition exchange method  

       4.
DBMS_REDEFINITION           


    select
 * from t_user_info_test;  


    --方法一
  

    drop table t_phone_test purge;  

create table t_phone_test(phone,part) nologging  partition by list(part)  

(  

partition p0 values('0'),  

partition p1 values('1'),  

partition p2 values('2'),  

partition p3 values('3'),  

partition p4 values('4'),  

partition p5 values('5'),  

partition p6 values('6'),  

partition p7 values('7'),  

partition p8 values('8'),  

partition p9 values('9')  

)   

as   

select user_mobile phone,substr(user_mobile,-1,1) part  

from t_user_info_test;  

  

  

select * from t_phone_test partition(p0);  

  

select * from t_phone_test where part='0';  

  

--方法二 交换分区   

     这种方法只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。适用于包含大数据量的表转到分区表中的一个分区的操作。尽量在闲时进行操作。  

  

交换分区的操作步骤如下:  

     1. 创建分区表,假设有2个分区,P1,P2.  

     2. 创建表A存放P1规则的数据。  

     3. 创建表B 存放P2规则的数据。  

     4. 用表A 和P1 分区交换。 把表A的数据放到到P1分区  

     5. 用表B 和p2 分区交换。 把表B的数据存放到P2分区。  

  

  

  

create table t_phone_test_0 nologging  

as   

select user_mobile phone,substr(user_mobile,-1,1) part  

from t_user_info_test where substr(user_mobile,-1,1)='0';  

  

select count(*) from t_phone_test where part='0';  

--4410   

select count(*) from t_user_info_test where substr(user_mobile,-1,1)='0';  

--4410   

  

alter table t_phone_test exchange partition p0 with table t_phone_test_0;  

  

  

delete from   t_phone_test_0;  

  

select count(*) from t_phone_test where part='0';  

select count(*) from t_phone_test_0;  

  

insert into t_phone_test(phone,part) values('15267046070','0');  

  

--p0一条数据,t_phone_test_0里4410条数据,交换之后p0是4410,t_phone_test_0是1,再执行一次数据又换回来了。   

  

insert into t_phone_test_0(phone,part) values('15267046070','1');  

alter table t_phone_test exchange partition p0 with table t_phone_test_0;  

delete from t_phone_test_0 where part='1';  

  

  

--合并分区   

----alter table tbname merge partitions/subpartitions pt1,pt2 into partition/subpartition pt3;   

  

alter table t_phone_test merge partitions p0,p1 into partition p0;  

  

  

select count(*) from t_phone_test where part='0';  

select count(*) from t_phone_test where part='1';  

  

select count(*)  from t_phone_test partition(p0);  

select count(*)  from t_phone_test partition(p1);  

  

  

  

 alter table t_phone_test  add partition p10 values(default);  

  

insert into t_phone_test(phone,part) values('15267046010','10');  

insert into t_phone_test(phone,part) values('15267046020','20');  

  

select * from   

  

--   

alter table t_phone_test drop partition p10;  

 alter table t_phone_test  add partition p10 values'10');  

   

alter table t_phone_test exchange partition p10 with table t_phone_test_10;  

--ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION   

alter table T_PHONE_TEST_10 modify PART VARCHAR2(2);  

alter table t_phone_test merge partitions p0,p10 into partition p0;  

  

--此时p0中有p0和p10的数据,但是p0的list不再是0而是0和10   

  partition P0 values ('10''0')  

    tablespace APP_DATAN  

    pctfree 10  

    initrans 1  

    maxtrans 255  

    storage  

    (  

      initial 1M  

      next 1M  

      minextents 1  

      maxextents unlimited  

      pctincrease 0  

    ),  

      

alter table t_phone_test exchange partition p0 with table t_phone_test_10;     

alter table t_phone_test drop partition p0;  

alter table t_phone_test  add partition p0 values'0');      

  

alter table t_phone_test exchange partition p0 with table t_phone_test_10;     

  

  

drop table t_phone_test_10 purge;  

create table t_phone_test_10 nologging  

as   

select user_mobile phone,substr(user_mobile,-2,2) part  

from t_user_info_test where substr(user_mobile,-2,2)='10';  

  

drop table t_phone_test_0 purge;  

create table t_phone_test_0 nologging   

as  

select  phone,substr(phone,-1,1) part  

from t_phone_test_10;  

  

alter table t_phone_test exchange partition p0 with table t_phone_test_0;  

  

  

select * from t_phone_test_10;  

  

  

  

select count(*)  from t_phone_test partition(p0);  

select count(*)  from t_phone_test partition(p10);  

select count(*) from t_phone_test_10;  

select count(*) from t_phone_test_0;  

  

  

  

select substr('123456',-1,1),substr('123456',-2,2),substr('123456',-3,2) from dual;  

  

  

---------------------------------------------------------   

1.创建分区表  

drop table t_phone_test purge;  

create table t_phone_test(phone,part) nologging  partition by list(part)  

(  

partition p0 values('0'),  

partition p1 values('1'),  

partition p2 values('2'),  

partition p3 values('3'),  

partition p4 values('4'),  

partition p5 values('5'),  

partition p6 values('6'),  

partition p7 values('7'),  

partition p8 values('8'),  

partition p9 values('9')  

)   

as   

select user_mobile phone,substr(user_mobile,-1,1) part  

from t_user_info_test;  

  

select count(*)  from t_phone_test partition(p0);--4410   

select count(*)  from t_phone_test partition(p10);  

select count(*) from t_phone_test_10;  

select count(*) from t_phone_test_0;  

  

2.创建基表  

drop table t_phone_test_10 purge;  

create table t_phone_test_10 nologging  

as  

select  phone,substr(phone,-2,2) part  

from t_phone_test where substr(phone,-2,2)='10';  

  

select count(*) from t_phone_test_10;--406   

  

--ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION   

alter table T_PHONE_TEST_10 modify PART VARCHAR2(2);  

  

3.添加分区  

alter table t_phone_test  add partition p10 values'10');      

select count(*)  from t_phone_test partition(p10);--0   

4.交换分区  

alter table t_phone_test exchange partition p10 with table t_phone_test_10;     

select count(*)  from t_phone_test partition(p10);--406   

5.合并分区  

alter table t_phone_test merge partitions p0,p10 into partition p0;  

select count(*)  from t_phone_test partition(p0);--4816   

--此时p0中有p0和p10的数据,但是p0的list不再是0而是0和10   

  partition P0 values ('10''0')  

    tablespace APP_DATAN  

    pctfree 10  

    initrans 1  

    maxtrans 255  

    storage  

    (  

      initial 1M  

      next 1M  

      minextents 1  

      maxextents unlimited  

      pctincrease 0  

    ),  

      

6.交换分区  

alter table t_phone_test exchange partition p0 with table t_phone_test_10;    

  

select count(*)  from t_phone_test partition(p0);--0   

select count(*) from t_phone_test_10;--4816   

  

  

6.删除分区 和添加分区  

alter table t_phone_test  drop partition p0;  

alter table t_phone_test  add partition p0 values('0');  

  

7.筛选数据  

drop table t_phone_test_0 purge;  

create table t_phone_test_0 nologging  

as  

select  phone,substr(phone,-1,1) part  

from t_phone_test_10 where substr(phone,-1,1)='0';  

  

select count(*) from t_phone_test_0;--4816   

  

8.交换分区  

alter table t_phone_test exchange partition p0 with table t_phone_test_0;    

  

select count(*)  from t_phone_test partition(p0);--4816   
select count(*) from t_phone_test_0;--0  

posted on 2014-05-07 22:31 鸿雁 阅读(312) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问