將普通表轉換成分區表有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';
select count(*) from t_user_info_test where substr(user_mobile,-1,1)='0';
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');
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 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;
alter table T_PHONE_TEST_10 modify PART VARCHAR2(2);
alter table t_phone_test merge partitions p0,p10 into partition p0;
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);
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;
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);
4.交換分區
alter table t_phone_test exchange partition p10 with table t_phone_test_10;
select count(*) from t_phone_test partition(p10);
5.合并分區
alter table t_phone_test merge partitions p0,p10 into partition p0;
select count(*) from t_phone_test partition(p0);
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);
select count(*) from t_phone_test_10;
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;
8.交換分區
alter table t_phone_test exchange partition p0 with table t_phone_test_0;
select count(*) from t_phone_test partition(p0);
select count(*) from t_phone_test_0;