我有一个表,该表具有1万亿行和8个索引,2个外键,并按保存年份的列进行分区。我为每个人计算的年份(单独包装),应删除少于该年份的数据。当前最后一个分区有6.51亿行,我需要从该分区中删除约600万行。以下是我尝试过的事情
删除香草-花费了很多时间
批量批量删除-花费了大量时间
交换分区-这是最快的,但是所有8个索引都变为不可用状态,我需要重建所有索引,这又需要时间。当前,Exchange分区也不起作用,因为父表具有隐藏的列,并且分区抛出错误
ORA-12996:无法删除系统生成的虚拟列
此表有30万人,我计算了每个人的年份,现在遍历每个人并将其删除,但在删除每个人后才提交。
答案 0 :(得分:3)
您可以尝试:
请注意,索引是在插入过程中生成的,方法是将所需数据记录到临时段中,然后再扫描这些临时段以构建索引,而不是完全扫描表本身。
答案 1 :(得分:-1)
您可以执行以下操作:
create table tablewithrelevantdata unrecoverable as select * from tabletobedeleted where ....;
drop table tabletobedeleted;
rename tablewithrelevantdata to tabletobedeleted;
create index tabletobedeleted_idx1 on tabletobedeleted(c1,c2) unrecoverable parallel 5;
由于您有索引,因此我将再次检查复合表(如此类表)上是否有索引
这里Class
以学生和老师的ID为主要关键字。在StudentId
的{{1}}和Teacherid
上建立索引很重要。
此外,您可以使用delete,例如:
Class