交換分區的操作步驟如下:1. 創建分區表t1,假設有2個分區,P1,P2.2. 創建基表t11存放P1規則的數據。3. 創建基表t12 存放P2規則的數據。4. 用基表t11和分區表T1的P1分區交換。 把表t11的數據放到到P1分區5. 用基表t12 和分區表T1p2 分區交換。 把表t12的數據 ...
交換分區的操作步驟如下:
1. 創建分區表t1,假設有2個分區,P1,P2.
2. 創建基表t11存放P1規則的數據。
3. 創建基表t12 存放P2規則的數據。
4. 用基表t11和分區表T1的P1分區交換。 把表t11的數據放到到P1分區
5. 用基表t12 和分區表T1p2 分區交換。 把表t12的數據存放到P2分區。
----1.未分區表和分區表中一個分區交換
create table t1
(
sid int not null primary key,
sname varchar2(50)
)
PARTITION BY range(sid)
( PARTITION p1 VALUES LESS THAN (5000) tablespace test,
PARTITION p2 VALUES LESS THAN (10000) tablespace test,
PARTITION p3 VALUES LESS THAN (maxvalue) tablespace test
) tablespace test;
SQL> select count(*) from t1;
COUNT(*)
----------
0
create table t11
(
sid int not null primary key,
sname varchar2(50)
) tablespace test;
create table t12
(
sid int not null primary key,
sname varchar2(50)
) tablespace test;
create table t13
(
sid int not null primary key,
sname varchar2(50)
) tablespace test;
--迴圈導入數據
declare
maxrecords constant int:=4999;
i int :=1;
begin
for i in 1..maxrecords loop
insert into t11 values(i,'ocpyang');
end loop;
dbms_output.put_line(' 成功錄入數據! ');
commit;
end;
/
declare
maxrecords constant int:=9999;
i int :=5000;
begin
for i in 5000..maxrecords loop
insert into t12 values(i,'ocpyang');
end loop;
dbms_output.put_line(' 成功錄入數據! ');
commit;
end;
/
declare
maxrecords constant int:=70000;
i int :=10000;
begin
for i in 10000..maxrecords loop
insert into t13 values(i,'ocpyang');
end loop;
dbms_output.put_line(' 成功錄入數據! ');
commit;
end;
/
commit;
SQL> select count(*) from t11;
COUNT(*)
----------
4999
SQL> select count(*) from t12;
COUNT(*)
----------
5000
SQL> select count(*) from t13;
COUNT(*)
----------
60001
--交換分區
alter table t1 exchange partition p1 with table t11;
SQL> select count(*) from t11; --基表t11數據為0
COUNT(*)
----------
0
SQL> select count(*) from t1 partition (p1); --分區表的P1分區數據位基表t11的數據
COUNT(*)
----------
4999
alter table t1 exchange partition p2 with table t12;
select count(*) from t12;
select count(*) from t1 partition (p2);
alter table t1 exchange partition p3 with table t13;
select count(*) from t13;
select count(*) from t1 partition (p3);
-----2.分區表和分區表交換
/*
EXCHANGE PARTITION WITH TABLE的方式不支持分區表與分區表的交換,只能通過中間表中轉.
*/
--2.1源表
create tablespace jinrilog
datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\jinrilog01.DBF'
size 200M autoextend on next 20M maxsize unlimited
extent management local autoallocate
segment space management auto
;
create tablespace jinrilogindex
datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\jinrilogindex01.DBF'
size 200M autoextend on next 20M maxsize unlimited
extent management local autoallocate
segment space management auto
;
create table t1
(
sid int not null ,
sname varchar2(50) not null,
createtime date default sysdate not null
)
PARTITION BY range(createtime)
(
PARTITION p1 VALUES LESS THAN ('2013-06-01 00:00:00') tablespace jinrilog,
PARTITION p2 VALUES LESS THAN ('2013-07-01 00:00:00') tablespace jinrilog,
PARTITION p3 VALUES LESS THAN ('2013-08-01 00:00:00') tablespace jinrilog,
PARTITION p4 VALUES LESS THAN (maxvalue) tablespace jinrilog
) tablespace jinrilog;
create unique index un_t1_01 on t1(sid,createtime)
tablespace jinrilogindex
local;
alter table t1 add constraint pk_t1 primary key(sid,createtime);
create index index_t1_01
on t1 (sname asc)
tablespace jinrilogindex
local
(
partition index_sname_01 tablespace jinrilogindex,
partition index_sname_02 tablespace jinrilogindex,
partition index_sname_03 tablespace jinrilogindex,
partition index_sname_04 tablespace jinrilogindex
);
--迴圈導入數據
declare
maxrecords constant int:=1000;
i int :=1;
begin
for i in 1..maxrecords loop
insert into t1 values(i,'ocpyang','2013-06-11 00:00:00');
end loop;
dbms_output.put_line(' 成功錄入數據! ');
commit;
end;
/
declare
maxrecords constant int:=2000;
i int :=1;
begin
for i in 1..maxrecords loop
insert into t1 values(i,'ocpyang','2013-07-11 00:00:00');
end loop;
dbms_output.put_line(' 成功錄入數據! ');
commit;
end;
/
declare
maxrecords constant int:=3000;
i int :=1;
begin
for i in 1..maxrecords loop
insert into t1 values(i,'ocpyang','2013-08-11 00:00:00');
end loop;
dbms_output.put_line(' 成功錄入數據! ');
commit;
end;
/
SQL> select count(*) from t1;
COUNT(*)
----------
6000
SQL> select count(*) from t1 partition(p1) ;
COUNT(*)
----------
0
SQL>
SQL> select count(*) from t1 partition(p2) ;
COUNT(*)
----------
1000
SQL> select count(*) from t1 partition(p3) ;
COUNT(*)
----------
2000
SQL> select count(*) from t1 partition(p4) ;
COUNT(*)
----------
3000
---查看表數據分區情況
select utp.table_name,utp.partition_name,utp.tablespace_name from user_tab_partitions utp
where utp.table_name='T1';
--查看分區索引分佈情況
col index_name for a20
col partition_name for a20
col tablespace_name for a20
col status for a10
select index_name,null partition_name,tablespace_name,status
from user_indexes
where table_name='T1'
and partitioned='NO'
union
select index_name,partition_name,tablespace_name,status from user_ind_partitions
where index_name in
(
select index_name from user_indexes
where table_name='T1'
)
order by 1,2,3
;
--2.2 和中間表交換數據
create table t11
(
sid int not null ,
sname varchar2(50) not null,
createtime date default sysdate not null
)tablespace jason;
select count(*) from t11;
alter table t1 exchange partition p2 with table t11;
--查看無效的索引並重建
col index_name for a20
col partition_name for a20
col tablespace_name for a20
col status for a10
select index_name,null partition_name,status
from user_indexes
where table_name='T1'
and partitioned='NO'
union
select index_name,partition_name,status from user_ind_partitions
where index_name in
(
select index_name from user_indexes
where table_name='T1'
)
order by 1,2,3
;
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
INDEX_T1_01 INDEX_SNAME_01 USABLE
INDEX_T1_01 INDEX_SNAME_02 UNUSABLE
INDEX_T1_01 INDEX_SNAME_03 USABLE
INDEX_T1_01 INDEX_SNAME_04 USABLE
UN_T1_01 P1 USABLE
UN_T1_01 P2 UNUSABLE
UN_T1_01 P3 USABLE
UN_T1_01 P4 USABLE
alter index INDEX_T1_01 rebuild partition INDEX_SNAME_02;
alter index UN_T1_01 rebuild partition P2;
col index_name for a20
col partition_name for a20
col tablespace_name for a20
col status for a10
select index_name,null partition_name,status
from user_indexes
where table_name='T1'
and partitioned='NO'
union
select index_name,partition_name,status from user_ind_partitions
where index_name in
(
select index_name from user_indexes
where table_name='T1'
)
order by 1,2,3
;
INDEX_NAME PARTITION_NAME STATUS
------------------------------ ------------------------------ --------
INDEX_T1_01 INDEX_SNAME_01 USABLE
INDEX_T1_01 INDEX_SNAME_02 USABLE
INDEX_T1_01 INDEX_SNAME_03 USABLE
INDEX_T1_01 INDEX_SNAME_04 USABLE
UN_T1_01 P1 USABLE
UN_T1_01 P2 USABLE
UN_T1_01 P3 USABLE
UN_T1_01 P4 USABLE
select count(*) from t1 partition (p2);
COUNT(*)
----------
0
select count(*) from t11;
COUNT(*)
---------
1000
--確定數據是否已經切換到新的表空間
SELECT TABLESPACE_NAME
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME='T1' AND PARTITION_NAME='P2';
TABLESPACE_NAME
------------------------------
JASON
---2.3中間表和歸檔表再次交換數據
create tablespace archive01
datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\archive01.DBF'
size 200M autoextend on next 20M maxsize unlimited
extent management local autoallocate
segment space management auto
;
create tablespace archive02
datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\archive02.DBF'
size 200M autoextend on next 20M maxsize unlimited
extent management local autoallocate
segment space management auto
;
create table t2
(
sid int not null ,
sname varchar2(50) not null,
createtime date default sysdate not null
)
PARTITION BY range(createtime)
(
PARTITION p1 VALUES LESS THAN ('2013-06-01 00:00:00') tablespace archive01,
PARTITION p2 VALUES LESS THAN ('2013-07-01 00:00:00') tablespace archive01,
PARTITION p3 VALUES LESS THAN ('2013-08-01 00:00:00') tablespace archive01,
PARTITION p4 VALUES LESS THAN (maxvalue) tablespace archive01
) tablespace archive01;
create unique index un_t2_01 on t2(sid,createtime)
tablespace archive02
local;
alter table t2 add constraint pk_t2 primary key(sid,createtime);
select up.table_name,up.partition_name,up.tablespace_name from user_tab_partitions up
where up.table_name='T2';
--查看分區索引分佈情況
col index_name for a20
col partition_name for a20
col tablespace_name for a20
col status for a10
select index_name,null partition_name,tablespace_name,status
from user_indexes
where table_name='T2'
and partitioned='NO'
union
select index_name,partition_name,tablespace_name,status from user_ind_partitions
where index_name in
(
select index_name from user_indexes
where table_name='T2'
)
order by 1,2,3
;
INDEX_NAME PARTITION_NAME TABLESPACE_NAME STATUS
-------------------- -------------------- -------------------- ----------
UN_T2_01 P1 ARCHIVE02 USABLE
UN_T2_01 P2 ARCHIVE02 USABLE
UN_T2_01 P3 ARCHIVE02 USABLE
UN_T2_01 P4 ARCHIVE02 USABLE
select count(*) from t2;
COUNT(*)
---------
0
--交換數據
alter table t2 exchange partition p2 with table t11 ;
select count(*) from t2;
select count(*) from t11;
以上內容轉自http://blog.csdn.NET/yangzhawen/article/details/8768943