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

Moving data from one partition to another

我有一个巨大的 table 包含大约 5 亿条记录。此 table 有 2 个分区,CURRENT_DATAPREVIOUS_DATA

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

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

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

(假设你有一个 list partition with VALUE = 'A' for current, and 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';

在应用上述操作之前和之后(两种情况应该return相同的结果)。

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

如果唯一的目标是将当前数据与以前的数据分开,为什么不使用两个不同的 tables PREVIOUS_DATA 和 CURRENT_DATA。您可以通过将两者结合在一起轻松获得完整的图片:

SELECT * FROM PREVIOUS_DATA
 UNION ALL
SELECT * FROM CURRENT_DATA 

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

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*/