如何从2个相关的表中删除30亿行

  • 本文关键字:删除 30亿行 2个 sql oracle
  • 更新时间 :
  • 英文 :


我有一个表有50亿行(表1),另一个表有30亿行(表2)。这两个表是相关的。我必须从表1中删除30亿行,并从表2中删除与之相关的行。表1是表2的子表。我尝试使用所有的方法从plsql它没有多大帮助。然后我想到了使用oracle分区策略。由于我不是DBA,我想知道是否可以在主键列上为选定数量的id对现有表进行分区?我的主键是64位自动生成的数字。

很难在线对对象进行分区(可以使用dbms_redefinition完成)。没有必要(你给的细节)。

最好的办法是重新创建没有不需要的行的对象。

例如:

create table undesired_data as (select undesired rows from table1);
Create table1_new as (select * from table1 where key not in (select key from undesired_data));
Create table2_new as (select * from table2 where key not in (select key from undesired_data));
rename table1 to table1_old;
rename table2 to table2_old;
rename table1_new to table1;
rename table2_new to table2;
recreate constraints;
check if everything is ok;
drop table1_old and table2_old;

这可以让消费者离线,但是如果脚本运行正常(您应该在测试环境中测试它们),那么停机时间将非常短。

听起来很可疑。
如果它是真实的用例,那么你不删除,你创建另一个表,定义良好,包括分区,并使用insert /*+ append */ into MyNewTable select ...填充它。
最常见的做法是根据日期(记录创建日期、事件日期等)定义分区。
同样,如果这是一个真实的用例,我强烈建议你去寻求真正的帮助,而不是在网上寻求建议,也不要自己去做。

最新更新