**问题陈述:**Oracle中有一个地址表,它与订阅者、成员等多个表有关系。目前的设计是,当关联表发生变化时,会递增所有表的记录版本。因此,即使已经存在相同地址,也会在地址表中添加新记录,从而导致大量重复副本。我们需要识别和删除重复记录,并更新关联表中的外键,同时确保这不会影响正在运行的应用程序。
试用方案:
- 我们已经编写了清理逻辑的脚本,其中每个地址都会生成唯一的哈希。如果计算的散列已经存在,则意味着地址是重复的,其中我们合并到单个地址记录中,并更新关联表中的外键。
- 但问题是地址表中约有3,000亿条记录,因此这一清理过程需要大量时间,需要几天时间才能完成。
- 我们已尝试为哈希列创建索引,但该过程仍需要时间。
- 我们还更新了插入/查询逻辑,按照新的结构使用地址(使用哈希,不使用版本),以照顾生产中的传入请求。
- 我们计划分块进行加工,但这将是一项非常漫长的持续活动。
问题:
1.我想知道上述方法是否还有进一步的改进之处
1.分布式处理在这方面会有帮助吗?(可能正在使用Hadoop Spark/HIVE/MR等)
1.这里有什么可以使用的工具吗?
2条答案
按热度按时间nle07wnf1#
建议1
使用内置的删除并行
建议2
使用分布式处理(Hadoop Spark/HIVE)--注意索引或表块上的潜在争用。建议让每个进程在逻辑隔离的子集上工作,例如
建议3
如果需要删除超过30%的表--最快的方法是创建一个空表,将所有必需的行复制到那里,删除原始表,重命名新表,创建所有索引+约束。当然,它需要停机时间,这在很大程度上取决于索引的数量--您拥有的索引越多,所需的时间就越长
另外,没有什么“神奇”的工具可以做到这一点。最后,它们都可以运行与您相同的SQL命令。
xj3cbfub2#
如果您使用干净的SQL,则可以使用oracle merge instruction插入数据。