将数据从一个分区移动到另一个分区



我有一个巨大的表,其中包含大约5亿条记录。此表有两个分区,CURRENT_DATAPREVIOUS_DATA

当新数据进入时,最后一个PREVIOUS_DATA分区被截断,来自CURRENT_DATA分区的数据被移动到PREVIOUS_DATA分区。

现在,我正在更新记录,以便从一个分区移动到另一个分区。然而,这需要很长时间。有没有更快的方法将数据从一个分区移动到另一个分区?

不要努力应用DML,但DROPRENAMEMODIFY分区,因为分区previous_data已经被截断,例如

(假设您有一个列表分区,其中VALUE = 'A'用于当前分区,VALUE = 'B'用于以前的分区(

ALTER TABLE tab 
DROP PARTITION previous_data; 
ALTER TABLE tab 
RENAME PARTITION current_data TO previous_data;
ALTER TABLE tab
MODIFY PARTITION previous_data
ADD VALUES ('B');
ALTER TABLE tab
MODIFY PARTITION previous_data
DROP VALUES ('A');
ALTER TABLE tab 
ADD PARTITION current_data VALUES ( 'A' );

通过查看分区

SELECT partition_name, high_value FROM USER_TAB_PARTITIONS WHERE table_name = 'TAB';

在应用上述操作之前和之后(两种情况都应返回相同的结果(。

小心!这些都是危险的操作,不应该在生产系统中尝试,而应该在测试数据库中尝试

如果唯一的目标是将当前数据与以前的数据分离,为什么不使用两个不同的表previous_data和current_data呢。通过将两者结合在一起,你可以很容易地了解全貌:

SELECT * FROM PREVIOUS_DATA
UNION ALL
SELECT * FROM CURRENT_DATA 

当新数据出现时,您可以删除PREVIOUS_data表,将CURRENT_data重命名为PREVIOUS_data,然后创建新的空CURRENT_data表:

DROP TABLE PREVIOUS_DATA;
ALTER TABLE CURRENT_DATA RENAME TO PREVIOUS_DATA;
CREATE TABLE CURRENT_DATA AS SELECT * FROM PREVIOUS_DATA WHERE 1 = 2; /*add comments and constraints*/

最新更新