Oracle DB中的数据清理花费了3000亿条记录的很长时间

bhmjp9jg  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(174)

**问题陈述:**Oracle中有一个地址表,它与订阅者、成员等多个表有关系。目前的设计是,当关联表发生变化时,会递增所有表的记录版本。因此,即使已经存在相同地址,也会在地址表中添加新记录,从而导致大量重复副本。我们需要识别和删除重复记录,并更新关联表中的外键,同时确保这不会影响正在运行的应用程序。

试用方案:

  • 我们已经编写了清理逻辑的脚本,其中每个地址都会生成唯一的哈希。如果计算的散列已经存在,则意味着地址是重复的,其中我们合并到单个地址记录中,并更新关联表中的外键。
  • 但问题是地址表中约有3,000亿条记录,因此这一清理过程需要大量时间,需要几天时间才能完成。
  • 我们已尝试为哈希列创建索引,但该过程仍需要时间。
  • 我们还更新了插入/查询逻辑,按照新的结构使用地址(使用哈希,不使用版本),以照顾生产中的传入请求。
  • 我们计划分块进行加工,但这将是一项非常漫长的持续活动。

问题:

1.我想知道上述方法是否还有进一步的改进之处
1.分布式处理在这方面会有帮助吗?(可能正在使用Hadoop Spark/HIVE/MR等)
1.这里有什么可以使用的工具吗?

nle07wnf

nle07wnf1#

建议1

使用内置的删除并行

delete /*+ parallel(t 8) */ mytable t where ...

建议2

使用分布式处理(Hadoop Spark/HIVE)--注意索引或表块上的潜在争用。建议让每个进程在逻辑隔离的子集上工作,例如

process 1 - delete mytable t where id between 1000 and 1999
process 2 - delete mytable t where id between 2000 and 2999
...

建议3

如果需要删除超过30%的表--最快的方法是创建一个空表,将所有必需的行复制到那里,删除原始表,重命名新表,创建所有索引+约束。当然,它需要停机时间,这在很大程度上取决于索引的数量--您拥有的索引越多,所需的时间就越长

另外,没有什么“神奇”的工具可以做到这一点。最后,它们都可以运行与您相同的SQL命令。

xj3cbfub

xj3cbfub2#

如果您使用干净的SQL,则可以使用oracle merge instruction插入数据。

相关问题