最近客戶方要求對某應用系統數據庫的特定表進行數據清理和歸類。由於該表數據量較大,約有700萬條數據。客戶希望將該大表的歷史數據遷移到另一表,遷移的數據量大概有500萬條數據,並在源表刪除遷移的數據量。對此,通過insert和truncate命令來進行表數據遷移和刪除。
正文:
根據客戶要求和提供的信息,如下:
用戶
源表
歷史表
臨時表
ADMINERP
ERP_T1
ERP_T2
ERP_T3
遷移數據
select * from erp_T1 where dorderdate is null or dorderdate<to_date('2013-01-01', 'yyyy-MM-dd')
保留數據
select * from erp_T1 where dorderdate>=to_date('2013-01-01', 'yyyy-MM-dd')
首先我們通過sqlplus以erpadmin用戶登錄:
SQL> create table ERP_T2 nologging as select * from erp_T1 where dorderdate is null or dorderdate<to_date ('2013-01-01', 'yyyy-MM-dd');
--------完成對歷史數據的遷移。
SQL> create table ERP_T3 nologging as select * from erp_T1 where dorderdate>=to_date ('2013-01-01', 'yyyy-MM-dd');
SQL> truncate table ERP_T1;
注:truncate命令只用於刪除表數據,不刪除表結構。刪除表數據有truncate和delete。為什麼這裡要用truncate?因為該表數據量大,要是使用delete效率慢,在commit之前可以回滾。但truncate刪除後無法恢復。所以切記清楚這一點。
SQL> insert /*+append */ into ERP_T1 select * from ERP_T3;
注:使用/*+append */可以結合NOLOGGING模式使用,效率提高不少。需要在4之前多執行一條命令:alter table ERP_T1 nologging; 在一個ARCHIVELOG 模式的數據庫上執行NOLOGGING 操作後,必須盡快為受影響的數據文件建立一個新的基准備份,從而
避免由於介質失敗而丟失對這些對象的後續修改。
SQL> DROP TABLE ERP_T3;
--------完成在源表刪除遷移數據。