標籤:dbf tables auto 轉換 之間 object_id object objects ora
Exchange partition提供了一種方式,讓你在表與表或分區與分區之間遷移資料。注意不是將錶轉換成分區或非分區的形式,而僅僅僅是遷移表中數
據(互相遷移),因為其號稱是採用了更改資料字典的方式,因此效率最高( 差點兒不涉及io操作)。
Exchange partition適用於全部分區格式,你能夠將資料從分區表遷移到非分區表。也能夠從非分區表遷移至分區表。
這就給批次更新分區表的資料提供了一個非常不錯的思路,這裡我便做一次普通表與分區表資料交換的實驗。
注意:分區表不能直接與分區表交換所以
假設對換分區表。用普通表過渡
假設對換普通表,用分區表過渡
索引必須是LOCAL INDEX,不能是GLOBAL INDEX
1.建立測試資料表空間
create tablespace tbs1 datafile ‘/oracle_data/szdb/tbs1_01.dbf‘ size 10m autoextend on;
create tablespace tbs2 datafile ‘/oracle_data/szdb/tbs2_01.dbf‘ size 10m autoextend on;
2.建立測試表
drop table t_temp purge;
drop table t_part_list purge;
create table t_temp as select 1 id, t.owner,t.OBJECT_NAME,t.OBJECT_ID,t.OBJECT_TYPE from dba_objects t;
create table t_part_list (id number,owner varchar2(20),object_name varchar2(40),object_id number,object_type varchar2(20))
partition by list (id)
(partition p1 values(1) tablespace tbs1,
partition p2 values(2) tablespace tbs2
);
3.查看錶資料
SQL> select count(*) from t_part_list;
COUNT(*)
---------
0
SQL> select count(*) from t_temp;
COUNT(*)
----------
80905
4.交換資料
alter table t_part_list exchange partition p1 with table t_temp;
或
alter table t_part_list exchange partition p1 with table t_temp without validation;--不再驗證資料有效性
5.查看錶資料
SQL> select count(*) from t_part_list;
COUNT(*)
----------
80905
SQL> select count(*) from t_part_list partition(p1);
COUNT(*)
----------
80905
SQL> select count(*) from t_temp;
COUNT(*)
----------
0
6.注意
在將未分區表的資料移轉到分區表中時。可能出現ora-14099的錯誤。儘管能夠用without validation去解決,可是此時進入分區表的資料可能不符合分區規則。
所以without validation一定要慎用。
涉及交換的兩表之間表結構必須一致,除非附加with validation子句;
假設是從非分區表向分區表做交換。非分區表中的資料必須符合分區表中指定分區的規則,除非附加without validation子句;
假設從分區表向分區表做交換,被交換的分區的資料必須符合分區規則,除非附加without validation子句;
Global索引或涉及到資料修改了的global索引分割區會被置為unusable,除非附加update indexes子句。
提示:一旦附加了without validation子句。則表示不再驗證資料有效性,因此指定該子句時務必謹慎。
oracle exchange partition 測試