【问题标题】:Moving data from one partition to another将数据从一个分区移动到另一个分区
【发布时间】:2021-03-31 10:53:47
【问题描述】:

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

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

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

【问题讨论】:

  • 你只有两个分区吗?你的分区键和类型是什么?在女巫分区数据中只有一个原则需要定义——数据是以前的还是当前的?
  • 为什么要移动分区数据?只需截断旧分区并添加新数据。
  • 有一个 ALTER TABLE… EXCHANGE PARTITIONALTER TABLE… MOVE PARTITION 但我真的看不出有任何理由。桌子长什么样子?

标签: oracle oracle12c database-partitioning


【解决方案1】:

不要努力申请DML,而是DROPRENAMEMODIFY分区,因为分区previous_data已经被截断如

假设您有一个 列表分区VALUE = 'A' 表示当前分区,VALUE = 'B' 表示以前的分区) p>

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';

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

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

【讨论】:

  • 我在尝试执行 alter table tab modify partition previous_data drop values ('A') 语句时遇到此错误。 14312. 00000 - “分区 %s 中已存在值 %s” *原因:ADD PARTITION 或 ADD VALUES 语句中的列表值之一已存在于另一个分区中 *操作:从语句中删除重复值并重试
  • 您是否将表tab 创建为CREATE TABLE tab ( col1 varchar2(20) ) PARTITION BY LIST(col1) ( PARTITION previous_data VALUES('B'), PARTITION current_data VALUES('A') );,然后逐步应用这五个步骤? @AbhinavDhiman
【解决方案2】:

如果唯一的目标是将当前数据与以前的数据分开,为什么不只使用两个不同的表 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*/

【讨论】:

  • 为什么要丢表?
  • @Wernfried Domscheit 我这样做而不是 PREVIOUS_DATA 分区截断或删除。
  • 但是只有一个表有两个分区。
  • @Wernfried Domscheit 我建议使用两张表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多