【发布时间】:2019-02-15 13:48:16
【问题描述】:
我有一个包含 1 万亿行和 8 个索引、2 个外键的表,并由一个包含年份的列进行分区。对于每个人,我计算年份(单独的包),少于该年份的数据应该被删除。目前最后一个分区有 6.51 亿行,我需要从这个分区中删除大约 600 万行。以下是我尝试过的事情
原版删除 - 花费大量时间
批量 FORALL 和 DELETE - 花费大量时间
-
交换分区 - 这是最快的,但所有 8 个索引都进入不可用状态,我需要重建所有索引,这又需要时间。目前 Exchange 分区也无法正常工作,因为父表有隐藏列并且分区会抛出错误提示
ORA-12996: 无法删除系统生成的虚拟列
这张表有 300 000 人,我计算了每个人的年份,现在遍历每个人并删除他们,但在删除每个人后提交。
【问题讨论】:
-
大概要保留多少记录?您可以考虑复制这些,截断表格并重新插入。
-
在一个分区中的 6.5 亿个中,我想删除大约 5 亿个。尝试使用 CTAS 然后重新插入,但由于表有 8 个索引,这又需要时间。
-
删除每一行后绝对不提交。
-
@DavidAldridge 如果我不这样做,撤消保留表将被填充并引发异常。我在删除每个人后提交。
-
保证删除尽可能慢。解决帽子问题的方法是使用没有太多撤消的操作,或者增加可用的撤消空间。